40

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

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

4

3 回答 3

54

简单的例子

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

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或者您可以发出错误信号。请务必查看 API 文档StreamController

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

对于复制粘贴

这是创建流的简单方法(复制粘贴的绝佳片段):

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

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

于 2013-01-26T16:15:32.693 回答
5

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

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

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

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

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

于 2014-08-04T21:02:10.620 回答
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();
}
于 2013-01-31T22:31:35.783 回答