0

我正在构建一个 Flutter 应用程序并遇到了以下问题。按照 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 上,一切都按预期工作。build 方法被调用 for Data.loading()和 for 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
  },
),
4

1 回答 1

0

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

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

'page': (context) => MyPage(bloc: Bloc()),
于 2019-04-11T06:55:37.417 回答