40

私は基本的にそれらの使い方を知っています。たとえば、要素の onClick ストリームをリッスンします。

しかし、独自のストリームをどのように設定するのでしょうか?

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

さらに、名前付きコンストラクターの 1 つを使用して を直接StreamControllerインスタンス化できます。Stream

  • Stream.fromFuture()1 つのイベントを発生させるストリームを返します (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 に答える