Flutter - rxdart - чтение потока несколько раз
У меня есть простое приложение, которое 2 вкладки, я пытаюсь вам блок шаблонов для перемещения данных.
Поток 1: 1. Запускается приложение, создается блок с засеянным значением 2. Для страницы запускается метод сборки и отображаются данные. 3. Пользователь переключается на другую вкладку. 4. Пользователь переключается обратно, в этом случае данные не отображаются, так как пар имеет уже будет прочитан один раз.
Одним из вариантов будет повторная подписка для повторной отправки начального значения.
Поток 2: 1. Приложение запускает блок, созданный с засеянным значением 2. Для страницы запускается метод сборки и отображаются данные. 3. Пользователь меняет фильтры - загружает потоки данных. 3. Пользователь переключается на другую вкладку 4. Пользователь переключается обратно, в этом случае данные не отображаются, поскольку пар уже считан один раз.
В этом случае я хочу, чтобы фильтр оставался на месте, и не хочу использовать начальное значение
блок
class DemoBloc {
final DemoApi demoApi;
Stream<String> _results = Stream.empty();
Stream<String> get results => _results;
BehaviorSubject<String> _tabName =
BehaviorSubject<String>.seeded('abc');
// BehaviorSubject<String> _tabName =
// BehaviorSubject<String>();
Sink<String> get tabName => _tabName;
DemoBloc(this.demoApi) {
print('initialized');
_results = _tabName
.asyncMap((tab) => tab)
.asBroadcastStream();
}
void dispose() {
_tabName.close();
}
}
0 ответов
Поскольку я использовал тему поведения, это не должно было быть проблемой, после расследования я обнаружил, что в некоторых случаях блок создавался снова, что привело к проблеме.
Как я нашел
Добавлен лог в конструктор блока. Добавлен лог для провайдера блока.
Результат
Когда я отклонил showSearch - он вызвал метод сборки родителя, который воссоздал блок.
Решение Переместил провайдера на уровень выше, так что метод сборки, даже если он вызывался несколько раз, не вызовет проблемы. Это все еще не решило проблему, потому что я использовал pushReplacement, pushReplacement заставил контекст создать новый блок. Наконец, провайдер переместился наверх, поэтому мое приложение для материала было дочерним от провайдера. Поскольку навигатор является частью материала, это решило проблему даже при использовании pushReplacement.