#flutter #flutter-getx
#flutter #flutter-getx
Вопрос:
У меня есть 2 экрана,
- Первый экран содержит представление списка с onPressed действием для каждого элемента
- второй экран содержит подробную информацию о нажатом элементе, а также ящик с тем же видом списка, что и на первом экране.
Что я хочу здесь сделать, так это то, что когда пользователь переходит на экран сведений и нажимает на элемент из ящика, должен появиться экран сведений и вернуться с новыми параметрами.
Код пока,
Маршрут
GetPage(
name: '/market-detail',
page: () => MarketDetail(),
binding: MarketDetailBinding(),
),
Привязка
class MarketDetailBinding extends Bindings {
@override
void dependencies() {
Get.lazyPut(() => MarketDetailController());
}
}
Нажмите действие на первом экране
onTap: () {
Get.toNamed('market-detail',
arguments: {'market': market});
},
Класс подробного экрана
class MarketDetail extends GetView<MarketDetailController> {
final Market market = Get.arguments['market'];
}
Нажмите действие на боковой панели подробного экрана
onTap: () {
Get.back();
Get.back();
Get.toNamed('market-detail',
arguments: {'market': market});
},
Сначала Get.back() закрывает ящик, затем удаляет маршрут и снова возвращает тот же маршрут,
Ожидаемое поведение,
MarketDetailController следует удалить из памяти и поместить снова,
Что на самом деле происходит
Контроллер получил только удаление и не возвращается в память при нажатии кнопки в ящике, пока я не перезапущу приложение (нажав Сохранить).
Если кто-нибудь это понимает, пожалуйста, помогите, я застрял здесь.
Ответ №1:
Как я вижу, вы пытаетесь всплывать и отправлять тот же маршрут с другим параметром, чтобы обновить определенный элемент на этом маршруте. Ну, если это так, то просто позвольте мне показать вам гораздо лучший способ.
В вашем классе MarketDetailController вы должны добавить эти:
class MarketDetailsController extends GetxController {
// A reactive variable that stores the
// instance of the market you're currently
// showing the details of.....
Rx<Market> currentMarket;
// this method will be called once a new instance
// of this controller gets created
// we will use it to initialize the controller
// with the required values
@override
void onInit() {
// some code here....
// .......
// intializing the variable with the default value
currentMarket = Market().obs;
super.onInit();
}
void updateCurrentMarket(Market market) {
// some code here if you need....
// updating the reative variable value
// this will get detected then by the Obx widgets
// and they will rebuild whatever depends on this variable
currentMarket.value = market;
}
}
Теперь внутри пользовательского интерфейса вашей страницы вы можете обернуть виджет, который будет отображать информацию о рынке, виджетом Obx следующим образом:
Obx(
() {
final Market currentMarket = controller.currentMarket.value;
// now you have the market details you need
// use it and return your widget
return MyAwesomeMarketDetailsWidget();
},
)
Теперь для вашего действия с щелчком мыши это может быть просто так:
onTap: () => controller.updateCurrentMarket(myNewMarketValue)
Это должно быть так. Кроме того, я советую вам изменить getView на GetWidget и Get.lazyPut() на Get.put()
Комментарии:
1. Я также подумал о том же решении. Спасибо тебе за помощь, брат. очень признателен.
2. @MuhammadUsman Отлично, добро пожаловать, брат. Я думаю, вам следует отметить мой ответ как решение, чтобы люди знали, что на этот вопрос уже дан ответ