Flutter使用GetX时退出页面变量重置,如何保留页面数据?
问题原因
你当前是将maintasks变量存储在页面的State类中,调用Get.back()退出页面后,页面实例和对应的State会被系统回收销毁,下次重新进入页面时会初始化全新的State实例,所以变量会被重置。setState只能管理当前State生命周期内的状态,无法跨页面销毁场景留存数据。
解决方法(基于GetX框架能力实现)
利用GetX的Controller托管需要持久留存的状态,将状态的生命周期和页面生命周期解绑:
步骤1:创建自定义Controller托管状态
继承GetxController,将需要留存的变量和修改方法都封装到Controller中:
class TaskController extends GetxController { // 定义可观测的maintasks变量 RxString maintasks = '默认内容'.obs; // 修改maintasks的方法 void updateMaintasks(String newContent) { maintasks.value = newContent; } }
步骤2:注册Controller到GetX依赖管理
注册时设置permanent: true,保证页面销毁后Controller不会被GetX自动回收:
可以在App启动时(main函数中)注册,也可以在第一次进入目标页面前注册:
Get.put(TaskController(), permanent: true);
步骤3:页面中使用Controller的状态
页面中不再单独定义maintasks变量,直接从Controller中获取状态,并用Obx包裹需要响应状态变化的组件:
// 页面内部先获取Controller实例 final TaskController taskController = Get.find<TaskController>(); // 原来的Text组件改造 Align( alignment: Alignment.topLeft, child: Padding( padding: const EdgeInsets.only(left: 25.0), child: Obx(() => Text( taskController.maintasks.value, style: const TextStyle( fontSize: 23, color: Colors.black, fontWeight: FontWeight.w800, ), )), ), ),
步骤4:修改状态时调用Controller方法
用户输入完成需要更新maintasks时,直接调用Controller的更新方法即可:
// 假设newInput为用户输入的新内容 taskController.updateMaintasks(newInput);
补充说明
如果需要区分不同页面实例的独立状态,注册Controller时可以添加tag参数做唯一标识,获取时传入对应的tag即可。
内容的提问来源于stack exchange,提问作者Neek666
相关产品推荐
相关产品推荐

