Корневой виджет не восстанавливается при переходе из дочернего

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

Когда используется Navigator.pop(context), приложение возвращается в ListView, но не перестраивается. Внесенные изменения не отображаются, пока я не принудительно перестрою (горячая перезагрузка)

Это новая проблема во флаттере 1.17.

Корневой просмотр

class ItemsView extends StatefulWidget {
  @override
  _ItemsView State createState() => _ItemsViewState();
}

class _ItemsViewState extends State<ItemsView> {
  @override
  Widget build(BuildContext context) {
    return FutureBuilder<List<Story>>(
        future: DBProvider.db.getAllItems(),
        builder: (BuildContext context, AsyncSnapshot<List<Story>> snapshot) {
          if (snapshot.hasData) {
            return Text(snapshot.data[0])
          }
        }
      )
    }
  } 

Второй просмотр

class ModifyView extends StatefulWidget {
  @override
  _ModifyView State createState() => _ItemsViewState();
}

class _ItemsViewState extends State<ItemsView> {
  @override
  Widget build(BuildContext context) {
    return FutureBuilder<List<Story>>(
        future: DBProvider.db.getAllItems(),
        builder: (BuildContext context, AsyncSnapshot<List<Story>> snapshot) {
          if (snapshot.hasData) {
            return Text(snapshot.data[0])
          }
        }
      )
    }
  } 

Как заставить виджет перезагружаться?


person Brady Stroud    schedule 10.05.2020    source источник
comment
@BradyStrud, пожалуйста, проверьте решение, приведенное ниже, и дайте мне знать, если возникнут проблемы.   -  person Ravindra Kushwaha    schedule 10.05.2020


Ответы (1)


Вы можете использовать Navigator's метод then, с помощью которого вы можете перезагрузить страницу или сделать что-нибудь еще. В приведенном ниже примере я использую экран A для перехода к экрану B навигации, а когда пользователь переходит от B к A , мы обновим вид или сделаем что-то другое, как показано ниже.

На экране A -> B

Navigator.push(
          context,
          MaterialPageRoute(
            settings: RouteSettings(
                name: B), ///// HERE "B" IS THE CLASS NAME
            builder: (context) =>
                B(),
          ),
        ).then((value) {
          //// THIS METHOD IS ENVOKE WHEN SCREEN COME FROM  B->A, YOU CAN PERFROM CAN TASK HERE
        });

На экране B нам нужно создать конструктор, как показано ниже.

class B extends StatefulWidget {

  B () ;

  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return _B();
  }
}

Переход от B к A

Navigator.pop(context, 1); //// HERE WE ARE PUSHING THE ANY VALUE "1" FOR THE RETURN IN then OF CLASS "A"
person Ravindra Kushwaha    schedule 10.05.2020
comment
Спасибо! Это решение сработало, но почему команда разработчиков флаттера изменила его в версии 1.17? - person Brady Stroud; 11.05.2020
comment
Рад помочь тебе, мужчина !!! О версии 1.17 сообщу вам в ближайшее время .. пожалуйста, проголосуйте за нее также - person Ravindra Kushwaha; 11.05.2020