如何创建在镖流?(How do you create a Stream in Dart?)

2019-07-18 18:07发布

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

但是,你如何建立自己的俱乐部?

Answer 1:

简单的例子

下面是一个完整的工作示例:

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()允许多个监听器。

对于复制pasters

这里有一个简单的方法来创建(用于复制pasters大片段)流:

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

然后,类可以只访问_onExitController以控制流(对于实施例.add()



Answer 2:

我刚刚创建了一个新的飞镖库调用event_stream使你的类创建自定义的事件更容易。 下面是一个例子:

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


Answer 3:

除了StreamController你可以实例化一个Stream以其命名的构造函数的一个直接:

  • Stream.fromFuture()返回触发一个事件流(不管'未来”完成对。)

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

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

这是非常方便的,你可以写预计消费流的代码,但是你有多种选择,以怎样的事件喂的那类。 例如: Stream.fromIterable()可以以一个单元测试被用于触发事件的已知序列,否则通常会被馈送从文件中读取数据的事件的类。



文章来源: How do you create a Stream in Dart?
标签: dart