Flutter GetX中能否创建Get.find<>()单实例引用简化调用?
报错原因
你当前的写法是将Get.find作为类的属性直接初始化,该操作会在Widget类实例化时同步执行,早于GetX服务定位器的实例加载时机,即使提前在main函数中执行了Get.lazyPut,也会因为执行时序问题找不到对应实例。
解决方案
方案1:使用late关键字延迟初始化
给xmlCtrl加上late修饰符,将Get.find的执行逻辑延迟到首次访问该变量时触发,此时Widget已完成挂载,GetX的实例注册流程已完成:
class XMLProcessingStatisticView extends StatelessWidget { var formKey = GlobalKey<FormState>(); // 加late延迟初始化 late final xmlCtrl = Get.find<XMLFilesStatController>(); @override Widget build(BuildContext context) { // 后续直接调用 xmlCtrl.foo.value 即可 return ...; } }
方案2:继承GetView(更推荐)
GetX封装的GetView类已经内置了Controller的获取逻辑,只需指定对应泛型,就可以直接通过controller属性访问实例,无需手动调用Get.find:
// 泛型绑定对应Controller class XMLProcessingStatisticView extends GetView<XMLFilesStatController> { var formKey = GlobalKey<FormState>(); @override Widget build(BuildContext context) { // 直接调用 controller.foo.value 即可 return ...; } }
方案3:build方法内声明局部变量
如果不想修改类结构,也可以直接在build方法内获取实例,Get.find本身是单例调用,不会产生额外性能开销:
class XMLProcessingStatisticView extends StatelessWidget { var formKey = GlobalKey<FormState>(); @override Widget build(BuildContext context) { final xmlCtrl = Get.find<XMLFilesStatController>(); // 后续直接调用 xmlCtrl.foo.value 即可 return ...; } }
内容的提问来源于stack exchange,提问作者Dmitry Bubnenkov
相关产品推荐
相关产品推荐

