Flutter - продолжайте слушать поток при смене страницы - PullRequest
0 голосов
/ 02 февраля 2020

Мой сценарий выглядит следующим образом:

  • a BottomNavigationBar, где одна страница содержит список элементов («listPage»), а другая страница представляет собой один элемент («itemPage»).

  • на обеих страницах можно перейти к элементу "itemPage", связанному с различными элементами.

  • "itemPage" отображает подробную информацию о продукте и имеет " Любимая "кнопка переключения.

  • в" listPage "каждый элемент, показанный через ListView.builder, показывает и может обрабатывать кнопку" Избранное ".

Я не могу понять, как отразить изменение «Избранное» в «itemPage» для других «itemPage» (если оно открыто несколько раз для одного и того же элемента, да, это возможно), а также для одного и того же элемента в «pageList» Msgstr ".

Я создал NotifierBlo c, в котором BehaviorSubject> Sink вызывается каждый раз, когда кнопка-переключатель" Избранное "меняет свое состояние (помещая itemId и логическое значение" Избранное "). После обновления базы данных выходной PublishSubject> Stream заполняется дополнительной информацией об элементе. Таким образом, каждый раз, когда переключается «Избранное», все подписчики получают информацию о флаге.

  BehaviorSubject<Item> inController = new BehaviorSubject<Item>();
  Sink<Item> get putUpdate => inController.sink;

  final PublishSubject<Item> outController = PublishSubject<Item>();
  Stream<Item> get getUpdates => outController.stream;

  NotifierBloc() {
    inController.listen(_handleToggle);
  }

  _handleToggle(Item item) {
    ...
    outController.sink.add(newItemAfterDatabaseCall);
  }

В ListPage и ItemPage (оба StatefulWidget) я создал StreamSubscription в методе DidChangeDependencies, который прослушивает NotifierBlo c Stream. StreamSubscription будет отменено в методе Dispose.

  StreamSubscription _subscription;

  void didChangeDependencies() {
    super.didChangeDependencies();
    _subscription = _notifierBloc.getUpdates.listen((item) => {
          // Do things with the Item like setState or call bloc methods
          ...
        });
  }

  void dispose() {
    _subscription?.cancel();
    super.dispose();
  }

Проблемы возникают при открытии нового itemPage: метод dispose отменяет подписку на предыдущей отображаемой странице, поэтому новые события не будут прослушиваться.

Кроме того, когда страница отображается из-за закрытия предыдущей страницы, StreamSubscription обновляется, и я получаю обновления о последнем избранном изменении, но мне нужен список избранных изменений, потому что, возможно, пользователь открыл несколько " itemPage "s.

Как я могу решить?

Может быть, поток должен быть передан на страницу (а не в состояние страницы)? Но как обращаться с функцией onData?

1 Ответ

0 голосов
/ 05 февраля 2020

Вам нужна какая-то система государственного управления. Посмотрите на Provider. Вот простой пример того, как вы могли бы его использовать. https://github.com/m-Skolnick/provider_example_flutter

...