Блок обмена Flutter между страницами

У меня есть базовое приложение флаттера с 2 страницами и 1 блоком.

  • На главной странице отображается список пользователей (всего 2 атрибута)
  • При щелчке по элементу пользователя на странице сведений отображаются все атрибуты.

Пользовательские данные извлекаются с помощью блока, который испускает 2 состояния

  • AllUsersLoadedState из api domain.com/users
  • UserLoadedState из api domain.com/users/id

Поскольку и домашняя страница, и страница сведений используют один и тот же блок в своем BlocBuilder, когда я перехожу на страницу сведений и нажимаю кнопку «Назад», домашняя страница выходит из строя.

Есть ли способ справиться с этим без написания 2 отдельных блоков?


person Darshan A S    schedule 25.03.2020    source источник
comment
Не могли бы вы поделиться своими файлами событий, состояний и блоков?   -  person Federick Jonathan    schedule 25.03.2020
comment
Поделитесь своим кодом, кнопка возврата не должна мешать чему-либо в вашем случае, поскольку описанный вами блок не зависит от навигации.   -  person Michel Feinstein    schedule 25.03.2020


Ответы (2)


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

Один из способов сделать это - предоставить BLoC с помощью пакета Provider или в виде InheritedWidget. Если вы используете Provider, то на каждом экране вы просто запрашиваете BLoC, используя Provider.of<MyBloc>(context). Вам нужно будет узнать больше о Provider, чтобы узнать, как его использовать.

Другой способ - передать BLoC как переменную конструктору вашего виджета.

person Michel Feinstein    schedule 27.03.2020

Я понял, в чем проблема. Поскольку обе страницы использовали один и тот же блок, они перестраивались в обоих состояниях, в то время как предполагалось, что домашняя страница перестраивалась только на AllUsersLoadedState, а страница сведений перестраивалась только на UserLoadedState.

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

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

person Darshan A S    schedule 04.04.2020