Flutter Getx 使用Get.to跳转页面时,控制器无法正常销毁的问题,控制器的init无法接收参数问题

先看我的代码 看着很正常

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应该禁止第一种方式,而不是警告,强制使用第二种,避免不必要的问题
好了,到此问题解决!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。