你如何在Dart中创建一个Stream?

Fer*_*rti 29 dart

我基本上知道如何使用它们; 例如,收听元素的onClick流.

但是,你如何设置自己的Streams?

Kai*_*ren 40

简单的例子

这是一个完整的工作示例:

import 'dart:async';
import 'dart:io';

class Application {
  Stream onExit;

  Application() {
    // Create a stream controller and assign its stream to "onExit".
    var controller = new StreamController();
    onExit = controller.stream;

    // Create some class that uses our stream.
    new UserOfStream(this);

    // Whenever we exit the application, notify everyone about it first.
    controller.add('we are shutting down!');
    exit(0);
  }
}

class UserOfStream {
  UserOfStream(app) {
    app.onExit.listen((String message) => print(message));
  }
}

main() => new Application();
Run Code Online (Sandbox Code Playgroud)

您还可以执行很酷的操作,例如检查是否有订阅者,controller.hasListener或者您可以发出错误信号.请务必查看API文档StreamController.

您可以使用new StreamController.broadcast()允许多个侦听器.

对于复制贴纸

这是创建流的简单方法(复制贴纸的优秀代码段):

class Something {
  StreamController _onExitController = new StreamController.broadcast();
  Stream get onExit => _onExitController.stream;
}
Run Code Online (Sandbox Code Playgroud)

然后类可以只访问_onExitController控制流(例如.add()).


Arg*_*tus 5

此外,StreamController您可以Stream直接使用其命名构造函数之一实例化 a :

  • Stream.fromFuture()返回触发一个事件的流(无论Future完成的是什么。)

  • Stream.fromIterable()返回将Iterable元素转换为事件序列的流。

  • Stream.periodic() 返回一个定期触发计算事件的流。

这非常方便,因为您可以编写期望使用流的代码,但是您有多种选择如何将事件提供给该类。例如:Stream.fromIterable() 可以在单元测试中用于将已知的事件序列触发到一个类,否则通常会从文件中读取数据事件。