Flutter: обратный вызов из обратной навигации создает плохое состояние: невозможно добавить новые события после вызова close

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

          FlatButton(
                  onPressed: () => Navigator.of(context).push(MaterialPageRoute(
                        builder: (context) =>
                            BlocProvider<SubsidiaryEditBloc>(
                                 builder: (BuildContext context) => SubsidiaryEditBloc(),
                                 child: SubsidiaryEditPage(subsidiary: subsidiary)
                             ) 
                            )).then((value) {
                              subsidiaryListBloc.dispatch(Reset()); 
                            }),
                  child: Text(
                    "Edit",
                  ),
                )

Когда редактирование / удаление завершено, пользователь возвращается назад, и я хочу, чтобы список отражал обновление / удаление. Для этого я использую обратный вызов «then» для действия «push», при котором я отправляю событие «Reset» в блок, прикрепленный к странице списка, что заставляет блок извлекать дочерние компании из репозитория, как если бы они были запрошены в первый раз. Однако это не совсем так. Когда дочерняя компания редактируется, сохраняется и пользователь возвращается назад, ничего плохого не происходит, список успешно обновляется. Но когда дочерняя компания удаляется, переход назад приводит к ошибке, упомянутой в теме. Я новичок в трепетании и еще не знаю всех подводных камней и четко не понимаю хороших и плохих практик. Является ли этот обратный вызов явным источником этой ошибки? Я предполагаю, что он привязан к конкретному экземпляру дочернего виджета, поэтому при изменении элементов списка виджет и блок удаляются - это правильно? Или мне не разрешено отправлять какие-либо события блока в навигации по какой-то другой причине?


person user2082616    schedule 19.11.2019    source источник


Ответы (1)


Использование ключевого слова «then» обычно не работает. Я использую await перед навигатором, поэтому он будет ожидать появления страницы, а затем запускать код отправки!

Попробуй это:

 FlatButton(
  onPressed: () async{
   await Navigator.of(context).push(MaterialPageRoute(
       builder: (context) =>
          BlocProvider<SubsidiaryEditBloc>(
                builder: (BuildContext context) => SubsidiaryEditBloc(),
                child: SubsidiaryEditPage(subsidiary: subsidiary)
            ) 
          ));
    subsidiaryListBloc.dispatch(Reset()); 
     },

              child: Text(
                "Edit",
              ),
            )
person Cristian Bregant    schedule 20.11.2019
comment
Пытался, и ничего не вышло. Да, async и await лучше и читабельнее, чем Futures, но технически они должны быть одинаковыми, или нет? - person user2082616; 21.11.2019