Я создаю приложение 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 все работает как положено. Метод сборки вызывается для
Data.loading()
и для Data.success()
.
Однако на iOS я вообще не получаю никаких данных (snapshot.hasdata == false
). Я добавил кнопку, которая при нажатии слушает поток и печатает
полученное значение. На Android я получаю последнее событие, как ожидается с BehaviorSubject. На iOS метод прослушивания не вызывался.
Кнопка:
MaterialButton(
child: Text('Click me'),
onPressed: () {
widget.bloc.stream.listen(print); // prints Data.success on Android, nothing on iOS
},
),