#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. Нет, это не я добавлю больше контента в свой пост