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 StreamControllercontroller = StreamController (); // 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 StreamControllercontroller2 = StreamController (); Stream 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 Futureresult = HttpRequest.getString('https://swapi.co/api/people/1'); Stream 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 result2 = HttpRequest.getString('https://swapi.co/api/people/2'); Stream peopleStream = Stream.fromFutures([result, result2]); peopleStream.listen( (person) => print('=> Got person: $person'), onDone: () => print('No more people on stream.') );
// Typeahead Listchars = 'Dart is awesome'.split(''); Stream charStream = Stream.fromIterable(chars); var idx = 0; charStream.listen((char) { Timer(Duration(milliseconds: idx * 200), () => print(char)); idx++; });