私は基本的にそれらの使い方を知っています。たとえば、要素のonClickストリームをリッスンします。
しかし、どのように独自のストリームを設定しますか?
これが完全な実例です:
_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
_のサブスクライバーがいるかどうかを確認するなど、クールなことを行うこともできます。または、 エラーを通知する することもできます。 StreamController
のAPIドキュメントを必ず確認してください。
new StreamController.broadcast()
を使用して、複数のリスナーを許可できます。
ストリームを作成する簡単な方法は次のとおりです(コピーペースト用の優れたスニペット)。
_class Something {
StreamController _onExitController = new StreamController.broadcast();
Stream get onExit => _onExitController.stream;
}
_
次に、クラスは__onExitController
_にアクセスして、ストリームを制御できます(たとえば、.add()
)。
StreamController
に加えて、名前付きコンストラクターの1つを使用してStream
を直接インスタンス化できます。
Stream.fromFuture()
1つのイベントを発生させるストリームを返します(「Future」が完了するものは何でも)。
Stream.fromIterable()
Iterable
要素を一連のイベントに変換するストリームを返します。
Stream.periodic()
計算されたイベントを定期的に発生させるストリームを返します。
これは、ストリームを消費することを期待するコードを記述できるため非常に便利ですが、そのクラスにイベントをフィードする方法については複数の選択肢があります。次に例を示します。Stream.fromIterable()
を単体テストで使用して、既知の一連のイベントをクラスに発生させることができます。そうしないと、通常はファイルから読み取られたデータイベントがフィードされます。
クラスでカスタムイベントを簡単に作成できるように、 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();
}