The two core parts of the app that you have implemented in this recipe are creating a stream of data, and listening (or subscribing) to the stream.
You have created a stream of data in the stream.dart file. Here, you added a method that returns a stream of color, and you marked the method as async*:
Stream<Color> getColors() async* {
In previous chapters, we have always marked a function as async (without the asterisk * symbol). In Dart and Flutter, you use async for futures and async* (with the asterisk * sign) for streams. As mentioned before, the main difference between a stream and a future is the number of events that are returned: just 1 for Future, and 0 to many for Stream. When you mark a function async*, you are creating specific type of function called a generator function because it generates a sequence of values (a stream).
Note the following code snippet:
yield* Stream.periodic(Duration(seconds: 1), (int t) ...