我正在构建一个 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
},
),