Streams represent a sequence of asynchronous events. Each event is either a data event, also called an element of the stream, or an error event, which is a notification that something has failed. When a stream has emitted all its events, a single "done" event will notify the listener that the end has been reached. In this lesson, we will learn how we can capture and handle streaming data, working with various Stream classes.
// Single Stream StreamController<String> controller = StreamController<String>(); // Setup listener controller.stream.listen( (data) => print('Received data: ${data.toUpperCase()}'), onDone: () => print('done'), onError: (e) => print('error $e') ); // Emit event controller.add('Hello'); controller.add('World'); // trigger error controller.addError('Throwing this error'); // trigger done await controller.close(); print('after done, return future, clean up');
// Broadcast Stream StreamController<String> controller2 = StreamController<String>(); Stream<String> boradcast = controller2.stream.asBroadcastStream(); boradcast.listen((data) => print('Received data: $data')); boradcast.listen((data) => print('Received data again: $data')); controller2.add('Hello1'); controller2.add('World2');
// Future-based streams Future<String> result = HttpRequest.getString('https://swapi.co/api/people/1'); Stream<String> resultStream = Stream.fromFuture(result); resultStream.listen( (data) => print('Got data: $data'), onError: (e) => print(e.type), onDone: () => print('No more data on stream.') ); // Future-based multi streams Future<String> result2 = HttpRequest.getString('https://swapi.co/api/people/2'); Stream<String> peopleStream = Stream.fromFutures([result, result2]); peopleStream.listen( (person) => print('=> Got person: $person'), onDone: () => print('No more people on stream.') );
// Typeahead List<String> chars = 'Dart is awesome'.split(''); Stream<String> charStream = Stream.fromIterable(chars); var idx = 0; charStream.listen((char) { Timer(Duration(milliseconds: idx * 200), () => print(char)); idx++; });