【问题标题】:rxdart BehaviorSubject does not emit last value on iOSrxdart BehaviorSubject 不会在 iOS 上发出最后一个值
【发布时间】:2019-08-31 15:08:21
【问题描述】:

我正在构建一个 Flutter 应用程序并遇到了以下问题。按照 BLoC 模式,我的代码结构如下:

BLoC:

class Bloc {
  final _subject = BehaviourSubject<Data>;

  Observable<Data> get stream => _subject.stream;

  void load() async {
    _subject.sink.add(Data.loading());
    final data = await /* ... */;
    _subject.sink.add(Data.success(data));
  }
}

状态:

@override
Widget build(BuildContext context) {
  return StreamBuilder<Data>(
    stream: widget.bloc.stream,
    builder: (context, snapshot) {
      print(snapshot);
      if (!snapshot.hasData || snapshot.data.isLoading) {
        return /* loadingindicator */;
      }

      return /* data view */;
    },
  );
}

@override
void initState() {
  super.initState();
  widget.bloc.load();
}

在 Android 上,一切正常。构建方法被调用 Data.loading() 和 Data.success()。

但是,在 iOS 上,我根本没有收到任何数据 (snapshot.hasdata == false)。我添加了一个按钮,单击它会监听流并打印 收到的值。在 Android 上,我收到了最后一个事件,正如 BehaviorSubject 所期望的那样。在 iOS 上,listen 方法没有被调用。

按钮:

MaterialButton(
  child: Text('Click me'),
  onPressed: () {
    widget.bloc.stream.listen(print); // prints Data.success on Android, nothing on iOS
  },
),

【问题讨论】:

  • 我严重怀疑 rxdart 的行为因平台而异。我也挑战你的假设,即问题在于你没有收到最后一个事件。由于您的 StreamBuilder 也从未接收到该事件,即使它正在侦听..您确定没有办法在您的流中出现 null 吗?我建议在您的initState 中添加一个widget.bloc.stream.listen((val) { print("debug: $val"); });(在调用load 之前),看看是否有任何东西被推入其中。
  • 嗨@herbert,感谢您的回复!我尝试在调用 load 之前订阅流,我确实收到了 Data.loading 和 Data.success。我觉得很奇怪的是,当我点击按钮时我调用的stream.listen(print) 在 iOS 上根本不打印任何东西,但在 Android 上却可以。我将尝试隔离该行为以检查它是否可能是问题所在。正如你所说,如果一个只有 dart 的库在这两个系统上表现不同,那就太奇怪了。
  • @herbert 感谢您为我指明了正确的方向!我发现了问题,当然,它与 rxdart 无关。再次感谢。

标签: dart flutter rxdart


【解决方案1】:

好的,我找到了问题所在。正如@herbert 向我指出的那样,rxdart 不太可能是这里的问题。

我查看了我的代码,发现我的页面正在重建,并且因为我的代码看起来像这样,所以该 bloc 被重新实例化。不知何故,这仅发生在 iOS 上而不是 Android 上。

'page': (context) => MyPage(bloc: Bloc()),

【讨论】:

    猜你喜欢
    • 2022-06-15
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    相关资源
    最近更新 更多