先看我的代码 看着很正常
class ControlPage extends StatelessWidget {
ControlPage({Key? key}) : super(key: key);
final ControlData data = Get.put(ControlData());
@override
Widget build(BuildContext context) {
return JPage(
title: "控制器声明外部,退出页面是否会销毁",
children: [],
);
}
}
然后跳转
Get.to(ControlPage(),arguments: {'id':999});
然后退出页面,之后看控制台打印
image.png
可以看出并没有控制器销毁的日志,然后我开始不知道怎么回事,于是乎我把控制器放到build里面声明,这样退出页面,控制器确实跟着销毁了,
但是,我百度看getx的文章,控制器并没有必须这样声明,所以肯定是哪里有问题
class ControlPage extends StatelessWidget {
ControlPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
final ControlData data = Get.put(ControlData());
return JPage(
title: "控制器声明外部,退出页面是否会销毁",
children: [],
);
}
}
于是乎,又看了一下日志,发现有个警告
image.png
这是 GetX 的一个优化建议警告,意思是你在使用 Get.to() 时,传入的是Widget 实例,而它建议你传入一个函数(Widget 构造器)。
理由是:
Get.to(MyPage()):这会立即实例化 MyPage,不利于内存管理,尤其是和 Controller 生命周期相关时。
Get.to(() => MyPage()):这是一个延迟构建的方式,只有在真正 push 页面的时候才创建页面实例,GetX 也能更好地在页面被销毁时自动释放相关 Controller。
如果你页面中用了 Get.put() 或 Get.lazyPut() 注册 Controller,或者用 GetBuilder / Obx 绑定状态管理,这种时候必须使用 () => Page(),否则 Controller 可能不会被销毁。
// ❌ 不推荐
Get.to(MyPage());
// ✅ 推荐
Get.to(() => MyPage());
使用 第二种方式之后,你会发现在控制的init可以正常获取参数了Get.arguments,如果是第一种,只能在onReady才可以获取到传入的参数
其实我觉得getx应该禁止第一种方式,而不是警告,强制使用第二种,避免不必要的问题
好了,到此问题解决!