Мой сценарий выглядит следующим образом:
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?