Flutter - rxdart - чтение потока несколько раз - PullRequest
0 голосов
/ 01 марта 2019

У меня есть простое приложение с двумя вкладками, я пытаюсь использовать шаблон блока для перемещения данных.

Поток 1: 1. Приложение запускает блок, созданный с затравленным значением 2. Метод сборкизапустить для страницы и данные показывает 3. Пользователь переключается на другую вкладку 4. Пользователь переключается обратно, в этом случае данные не отображаются, поскольку пар уже был прочитан один раз.

Одним из вариантов будет повторная подписка наотправьте начальное значение еще раз.

Поток 2: 1. Блок запускает приложение, создается с засеянным значением 2. Для страницы запускается метод сборки, и данные показывают 3. Пользователь изменяет фильтры - которые запускают потокданные загружаются 3. Пользователь переключается на другую вкладку 4. Пользователь переключается обратно, в этом случае данные не отображаются, поскольку пар уже был прочитан один раз.

В этом случае я хочу сохранить фильтрна месте и не хотят использовать начальное значение

Bloc

    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();
  }
}

1 Ответ

0 голосов
/ 21 марта 2019

Поскольку я использовал тему поведения, это не должно было быть проблемой, после расследования я обнаружил, что в некоторых случаях блок создавался заново, что привело к проблеме.

КакЯ нашел

Добавлен журнал в конструктор блока Добавлен журнал для провайдера блока - также зарегистрирован вызывающий

Результат

КогдаЯ отклонил showSearch - он запускает метод сборки родительского элемента, который воссоздает блок.

Решение Перемещен поставщик на уровень выше, поэтому метод сборки, даже если он вызывается несколько раз, не вызоветПроблема Это до сих пор не решило проблему, потому что я использовал pushReplacement, pushReplace заставил контекст создать новый блок.Наконец, провайдер переместился наверх, поэтому мое приложение для материала было дочерним от провайдера.Поскольку навигатор является частью материала, это решило проблему даже при использовании pushReplacement.

...