Flutter GetX:Get.to(page)与Get.to(() => page)的差异及优劣对比
Get.to(() => Page())而非Get.to(Page())? 你觉得二者没区别很正常,但实际在资源消耗、状态管理、灵活性上有不小差异,具体来说:
实例创建时机不同
Get.to(Page())会直接创建Page的实例——不管用户最终是否完成导航(比如快速点击返回取消跳转),这个页面的构造函数、initState都会提前执行,要是页面有复杂初始化逻辑(比如启动网络请求、加载本地大文件),会白白浪费内存和CPU资源。
而Get.to(() => Page())传递的是一个构造器函数,只有当GetX确认要执行导航时,才会调用这个函数创建页面实例,属于懒加载,能有效避免不必要的资源消耗。热重载与状态管理的兼容性
如果你的页面依赖GetX的状态管理(比如在页面里用Get.put()注入依赖),直接传实例的写法在热重载时容易出问题:旧的页面实例没被正确销毁,新实例可能会和旧的状态绑定,导致状态混乱、数据不更新。
用构造器函数的方式,每次导航都会生成全新的页面实例,热重载时能保证状态和实例的正确关联,避免状态污染。动态参数传递更灵活
当需要给页面传动态参数时,Get.to(() => Page(id: currentId))可以在导航触发时才获取最新的参数值;如果用Get.to(Page(id: currentId)),参数值是在调用Get.to时就固定的,要是后续currentId变化,已经创建的页面实例不会同步更新,容易出现参数不匹配的问题。符合GetX的设计初衷
GetX的路由模块本身就围绕懒加载、高效资源管理设计,传递构造器函数的写法更贴合框架的设计思路,能更好地利用框架的性能优化特性。
内容的提问来源于stack exchange,提问作者Rafhaela

