Как сделать навигатор.из(контекста).всплывающего окна на странице и сбросить его на Flutter

#flutter

Вопрос:

У меня есть страница продукта, на которой есть некоторая информация. На этой странице есть несколько виджетов внутри.

Проблема в том, когда я изменяю эту информацию и нажимаю кнопку «Назад» в верхней части страницы, которая выполнит Navigator.of(контекст).pop.

Когда я снова нажимаю, чтобы показать страницу, продукт содержит ту же информацию, что и раньше.

Как я могу сбросить страницу при выполнении Navigator.of(контекст).pop?

Моя проблема решается, если я использую:

 Navigator.of(context).pushReplacementNamed('/Pages', arguments: 0);
 

Но я этого не хочу, потому что каждый раз, когда я выполняю PUSH-замену, они снова загружают страницу, уже загруженную ранее.

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

Сначала я нажимаю на изображение продукта в сетке, и это то, что я выполняю:

 Get.toNamed('/Food',   arguments: new RouteArgument(
                        heroTag: this.widget.heroTag,
                        param:  widget.foodList.elementAt(index),),);
 

Когда я меняю страницу, я выполняю эту функцию:

   @override
  Widget build(BuildContext context) {
    _con.iniPage(this.routeArgument);
    return Scaffold(
      appBar: PreferredSize(
        preferredSize: Size.fromHeight(0.0), // here the desired height
        child: AppBar(
          automaticallyImplyLeading: false,
          brightness: Brightness.dark,
          backgroundColor: Colors.transparent,
        ),
      ),
 

Эта функция _con.iniPage(this.routeArgument); выполняет событие клонирования из объекта, переданного параметром, и это функция:

 iniPage(RouteArgument routeArgument) {
    this.routeArgument = new RouteArgument(
                            heroTag: routeArgument.heroTag,
                            param: routeArgument.param,);
    Food foodTemp = routeArgument.param;
    this.food = routeArgument.param.copyAll(food: foodTemp);
    calculateTotal();
}
 

Видите, что я клонирую объект? Это моя функция клонирования:

 Food copyAll({Food food}) {
    return Food(
      id: id ?? food.id,
      name: name ?? food.name,
      price: price ?? food.price,
      discountPrice: discountPrice ?? food.discountPrice,
      image: image ?? food.image,
      description: description ?? food.description,
      ingredients: ingredients ?? food.ingredients,
      weight: weight ?? food.weight,
      unit: unit ?? food.unit,
      packageItemsCount: packageItemsCount ?? food.packageItemsCount,
      featured: featured ?? food.featured,
      deliverable: deliverable ?? food.deliverable,
      restaurant: restaurant ?? food.restaurant,
      category: category ?? food.category,
      extraGroupsFoods: extraGroupsFoods ?? food.extraGroupsFoods,
      extraGroupsRules: extraGroupsRules ?? food.extraGroupsRules,
      foodReviews: foodReviews ?? food.foodReviews,
      nutritions: nutritions ?? food.nutritions
    );
  }
 

После клонирования это первое, что я делаю, моя страница делает цикл в этом виджете:

                     _con.food.extraGroupsFoods != null amp;amp;
                            _con.food.extraGroupsFoods.length > 0
                        ? Column(
                            children: [
                              for (var extraGroupFood in _con.food.extraGroupsFoods)
                                _con.getExtraSelectType(
                                extraGroupFood,
                                _con.food.extraGroupsRules),
                              ExtraObsWidget(_con.getObsText),
                            ],
                          )
                        : Container(),
 

Проблема в том, что я просто зацикливаюсь на клонированном объекте, но если я изменю информацию в этом конкретном виджете, нажму назад, чтобы открыть этот экран и вернуться на этот экран, состояние моей информации не сбросится, почему?

И когда я вижу, что объект параметра был изменен, и я не знаю, почему, потому что я сделал клон из этого объекта.

Ответ №1:

если вы имеете в виду сброс второй страницы, используйте WillPopScope для сброса второй страницы перед появлением

 WillPopScope(
    onWillPop: () async {
    // your reset logic here
   return Future.value(true);
},
    child: new Scaffold(
 

если вы имеете в виду сброс первой страницы, используйте ожидание с нажатием, чтобы сбросить первую страницу после возвращения

 await Navigator.of(context).pushNamed('/Pages');
// some logic will execute when popping second page
 

Комментарии:

1. Это для сброса второй страницы, когда я ее открою, я попробую вам первый пример

2. и если это решило ваш вопрос, отметьте вопрос как отвеченный

3. Нет, это не я добавлю больше контента в свой пост