【问题标题】:How to prevent dropping event when it is a broadcast stream?当它是广播流时如何防止丢弃事件?
【发布时间】:2019-03-28 06:01:15
【问题描述】:

我想防止颤动在没有小部件正在侦听时丢弃广播流事件。因为我想在其他页面路由中听这个。

我有如下的块对象。

class UserBloc extends Object {
    final _user = StreamController<UserModel>.broadcast();
    final _uid = StreamController<String>.broadcast();

    Stream<UserModel> get user => _user.stream;
    Stream<String> get uid => _uid.stream;

    Function(UserModel) get setUser => _user.sink.add;
    Function(String) get setUID => _uid.sink.add;

我正在我的子页面路由中收听这些流

StreamBuilder(
    stream: userBloc.user,
    builder: (context, snapshot) {
    print(snapshot.connectionState);
    print(snapshot.data);
    return Text('hi');
    },
),

它可以在不使用广播流的情况下工作。但是,当我改为广播时,运气不佳。

问题是广播流会在没有人收听时丢弃事件,但我想在我的另一个 MaterialPage 弹出时开始收听。

使用广播流,当我开始收听时,流中的数据始终为空。

我怎样才能做到这一点?

【问题讨论】:

  • StreamController.broadcast 不允许这样做。但是您可以将StreamController() 用于_uid 并公开uid =&gt; _uid.stream.transform(LazyBroadcastTransformer()) 变压器来自这里的位置:pub.dartlang.org/packages/lazy_broadcast

标签: stream flutter broadcast


【解决方案1】:

将 StreamController 替换为来自 RxDart package 的 BehaviorSubject。

一个特殊的 StreamController 捕获最新的项目 添加到控制器中,并将其作为第一项发送给任何新的 听众。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多