首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >先前增加的流值以返回侦听(广播流)

先前增加的流值以返回侦听(广播流)
EN

Stack Overflow用户
提问于 2020-06-09 06:21:28
回答 2查看 1.1K关注 0票数 5

我有一个定制的StreamController<int>

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
final StreamController listener = StreamController<int>.broadcast();

初始化后,我向流发出一个值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
listener.add(7);

在发出值后,我设置了一个Stream侦听器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
listener.stream.listen((val) {
    print(val);
});

预期的行为是侦听器将返回以前设置的值,但是情况并非如此。只有在设置侦听器之后设置值时,侦听器才会被调用。

我怎样才能做到这种行为?

(编辑:必须支持多个侦听器)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-09 06:54:22

首先,不要使Stream成为广播流,因为这类流的定义是允许多个订阅者,但是如果没有当前订阅者,则所有事件都将丢失。

然后,查看从asBroadcastStream返回的Stream上的StreamController。这种方法允许实现在第一个订阅者之后首先侦听流的逻辑,并且如果没有更多的订阅者,还可以像暂停流这样的逻辑。

票数 3
EN

Stack Overflow用户

发布于 2021-05-18 01:06:14

您可以为它使用StreamController onListen回调,因为每次有人订阅时都会调用它。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class StreamExample {
  late final StreamController<dynamic> _controller;
  dynamic _val;

  StreamExample() {
    _controller = StreamController.broadcast();
    _controller.onListen = () => _controller.add(_val);
  }

  /// Example setter for value which works 
  /// like [ChangeNotifier] for [Stream] listeners.
  void set val(value) {
    _val = value;
    _controller.add(value);
  }

  Stream<dynamic> get stream => _controller.stream;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62284828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文