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

时间:2013-01-26 11:22:45

标签: dart

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

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

3 个答案:

答案 0 :(得分:36)

简单示例

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

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();

您还可以执行很酷的操作,例如检查是否有controller.hasListener的订阅者,或者signal an error。请务必查看StreamController上的API文档。

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

对于复制贴纸

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

class Something {
  StreamController _onExitController = new StreamController.broadcast();
  Stream get onExit => _onExitController.stream;
}

然后,班级可以访问_onExitController来控制流(例如.add())。

答案 1 :(得分:2)

我刚刚创建了一个名为event_stream的新Dart库,可以更轻松地在类上创建自定义事件。这是一个例子:

class ClassWithEvents implements NotifyPropertyChanged {
  String _someProperty;

  final EventStream<PropertyChangedEventArgs> _onPropertyChangedEvent = new EventStream<PropertyChangedEventArgs>();
  Stream<PropertyChangedEventArgs> get onPropertyChanged => _onPropertyChangedEvent.stream;

  final EventStream _onClosedEvent = new EventStream();
  Stream get onClosed => _onClosedEvent.stream;

  String get someProperty => _someProperty;
  set someProperty(String value) {
    _onPropertyChangedEvent.signal(new PropertyChangedEventArgs('someProperty', value));
    _someProperty = value;
  }

  close() {
    _onClosedEvent.signal();
  }
}

main() {
  var c = new ClassWithEvents();
  c.onPropertyChanged.listen((PropertyChangedEventArgs<String> args) => print('changed: name=${args.propertyName} value=${args.value}'));
  c.onClosed.listen((_) => print('closed'));
  c.someProperty = "test";
  c.close();
}

答案 2 :(得分:2)

StreamController之外,您还可以直接使用其中一个命名构造函数实例化Stream

  • Stream.fromFuture()返回触发一个事件的流(无论“未来&#39;完成”。

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

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

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