【问题标题】:Dart Flutter: Why use getter instead of setter for Stream Sink?Dart Flutter:为什么 Stream Sink 使用 getter 而不是 setter?
【发布时间】:2020-07-19 12:24:59
【问题描述】:

根据我对Streamsink 的基本理解,我们将数据添加到接收器以便将其传递到流中,但要添加它,我们使用getter 而不是setter,我认为这违反直觉(参见下面的示例),你能用简单的话解释一下为什么会这样而不是相反吗?

例子:

class BlogPostViewModel {
  StreamController<List<BlogPost>> _blogPostListController = StreamController.broadcast();
  Stream<List<BlogPost>> get outBlogPostList => _blogPostListController.stream;
  Sink<List<BlogPost>> get _inBlogPostList => _blogPostListController.sink; // Here why use get and not a setter?
}

提前,谢谢。

【问题讨论】:

  • 你可以。没有真正的理由不这样做。
  • @RémiRousselet 你能解释一下吗?
  • Sink&lt;int&gt; get foo =&gt; _sink 上使用set foo(int value) =&gt; _sink.add(value) 并没有真正的缺点。唯一的区别是您无权访问Sink.close,但这并不重要。

标签: dart stream sink


【解决方案1】:

gettersetter 概念是一种模拟对类中字段的访问但控制其行为的方法。因此,如果我们想在幕后甚至没有任何变量,例如有一个 getter 每次都从某个地方获取一些数据(请不要这样做)。

getset 因此是我们尝试获取和设置该字段的值时调用的方法:

class MyClass {
  void get test => print('You called get');
  set test(void input) => print('You called set');
}

void main() {
  final obj = MyClass();
  obj.test;         // You called get
  obj.test = null;  // You called set
}

因此,在您的情况下,您希望这样当您尝试获取名为 _inBlogPostList 的“变量”时,您将获得 _blogPostListController.sink 的结果。

这样做的好处是你得到一个Sink 实例,你可以调用addclose。如果您不需要 close 接收器,则可以改为使用 set 方法将东西添加到接收器中,就像 Rémi Rousselet 建议的那样。

【讨论】:

  • 非常感谢!
猜你喜欢
  • 2011-09-06
  • 2011-09-11
  • 1970-01-01
  • 1970-01-01
  • 2018-10-25
  • 1970-01-01
  • 2014-02-23
  • 1970-01-01
相关资源
最近更新 更多