rxdart BehaviorSubject не выдает последнее значение на iOS - PullRequest
0 голосов
/ 10 апреля 2019

Я создаю приложение 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
  },
),

1 Ответ

0 голосов
/ 11 апреля 2019

Хорошо, я нашел проблему. Как указал мне @herbert, очень маловероятно, что проблема была в rxdart.

Я просмотрел свой код и обнаружил, что моя страница была перестроена, и, поскольку мой код выглядел так, блок был обновлен. Это как-то произошло только на iOS, а не на Android.

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