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

没有一个很好的方法可以解决需要将某个对象解构为多个最终字段的一般问题,这基本上是您在这里尝试的。但好消息是,通常您并不需要这样做。我推荐的两种方法是工厂构造函数,而不是保持派生状态。

工厂构造函数很棒,因为您可以在调用真正的构造函数之前执行任意计算来创建参数,而实际构造函数通常只有一个初始化列表。在这种情况下,您可以让工厂构造函数创建 StreamController 并将其和流传递给私有构造函数。

不过,对您来说更好的是不要将 Stream 存储在字段中,因为您可以通过控制器访问它。我一直用流做这个:

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

onBark 实际上是从_onBarkController 派生的值,所以不需要存储它。

于 2013-08-10T20:03:37.887 回答