3

クラスのイベント ストリームを初期化しようとしています。そのストリームを最終的なものにしたいのですが、によって制御されStreamControllerます。次のコードを試しました:

import "dart:async";

class Dog {
  final StreamController _onBarkController;
  final Stream onBark;

  Dog() :
    _onBarkController = new StreamController(),
    onBark = _onBarkController.stream;

}

しかし、へのアクセス (暗黙的であっても)thisが初期化子リストで禁止されているため、このコードは違法です。

これを達成する方法はありますか?

4

1 に答える 1

4

一部のオブジェクトを複数の最終フィールドに分解する必要があるという一般的な問題を解決する優れた方法はありません。これは、基本的にここで試みていることです。しかし、良いニュースは、通常は本当に必要ないということです。私がお勧めする 2 つのアプローチは、ファクトリ コンストラクターと派生状態を保持しないことです。

ファクトリ コンストラクターが優れているのは、実際のコンストラクターを呼び出す前に任意の計算を実行して引数を作成できるためです。実際のコンストラクターは通常、初期化子リストのみを持つことができます。この場合、ファクトリ コンストラクターで StreamController を作成し、それとストリームをプライベート コンストラクターに渡すことができます。

ただし、コントローラーを介してストリームにアクセスできるため、ストリームをフィールドに保存しないことをお勧めします。私はこれを常にストリームで行います:

class Dog {
  final StreamController _onBarkController = new StreamController();
  Stream get onBark => _onBarkController.stream;
}

onBark は実際には _onBarkController から派生した値であるため、保存する必要はありません。

于 2013-08-10T20:03:37.887 に答える