You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GetX Controller未自动销毁,页面返回后控制器状态未重置

GetX页面返回后Controller未销毁重置问题解决

问题根因

  1. Get.put()默认会将Controller全局存入GetX内存缓存,无主动销毁操作时,后续调用相同类型、相同tag的Get.put()会直接返回已存在的旧实例,不会重新初始化。
  2. 你将Get.put(MyController())声明为MainScreen的类成员变量,该初始化逻辑仅在MainScreen第一次实例化时执行,后续进入页面不会重新触发。
  3. 未绑定路由生命周期的Controller不会被GetX自动监听销毁,即使页面被pop,缓存中的Controller实例仍会保留。

可用解决方案

方案1:最小改造成本,使用Get.create()

Get.create()特性为每次页面进入创建新的Controller实例,页面销毁时自动释放,仅需修改MainScreen的Controller初始化逻辑:

class MainScreen extends StatelessWidget {
  // 替换原Get.put为Get.create
  final MyController controller = Get.create(() => MyController());

  // 其余代码保持不变
}

方案2:路由绑定方案,符合GetX规范

  1. 定义路由绑定类,关联Controller和对应页面的生命周期
class MainScreenBinding extends Bindings {
  @override
  void dependencies() {
    Get.lazyPut(() => MyController());
  }
}
  1. 修改跳转逻辑,传入绑定类
// LandingScreen中的跳转逻辑修改为
ElevatedButton(
  onPressed: () => Get.to(() => MainScreen(), binding: MainScreenBinding()),
  child: const Text('Navigate to Second Screen'),
)
  1. MainScreen中用Get.find获取Controller
class MainScreen extends StatelessWidget {
  final MyController controller = Get.find<MyController>();

  // 其余代码保持不变
}

该方案下路由pop时GetX会自动销毁对应绑定的所有Controller,下次进入自动重新初始化。

方案3:手动销毁Controller

如果不想调整现有初始化逻辑,可以将MainScreen改为StatefulWidget,在销毁回调中手动删除缓存的Controller:

class MainScreen extends StatefulWidget {
  const MainScreen({super.key});

  @override
  State<MainScreen> createState() => _MainScreenState();
}

class _MainScreenState extends State<MainScreen> {
  final MyController controller = Get.put(MyController());

  @override
  void dispose() {
    // 页面销毁时主动删除Controller
    Get.delete<MyController>();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    // 原有build逻辑保持不变
  }
}

补充说明

你当前使用原生Navigator.of(context).pop()和GetX提供的Get.back()效果一致,无需额外调整,不过统一使用GetX的路由API可以避免特殊场景下的路由监听异常。

内容的提问来源于stack exchange,提问作者Akash Gorai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 13:12:01