[Dart] Capture and Handle Data Sequences with Streams in Dart

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++;
  });
原文地址:https://www.cnblogs.com/Answer1215/p/11454287.html