Flutter中GetX实例的正确声明方式及两种写法差异解析
GetX实例声明的常见疑问解析
1. 把GetX实例声明在build方法里,会不会每次重建都重复创建?可行吗?
完全可行,不会重复创建Controller实例。
GetX的Get.put()自带依赖管理的单例特性:当你调用Get.put(SongPlayerController())时,GetX会先检查依赖容器里是否已存在SongPlayerController类型的实例——如果不存在才会创建新实例并注册;如果已存在,直接返回现有实例,不会重新初始化。
哪怕build方法因父组件状态变化、屏幕旋转等原因多次执行,Get.put()也只是重复获取已有的实例,不会重复创建Controller。至于有人这么写,大多是为了代码就近性,在需要用到的地方直接声明,属于个人编码习惯问题。
2. 两种声明方式的核心区别
方式一:build方法内声明
class PlaySongScreenHeader extends StatelessWidget { const PlaySongScreenHeader({Key? key}) : super(key: key); @override Widget build(BuildContext context) { //declaring inside build method SongPlayerController songPlayerController=Get.put(SongPlayerController()); // ... } }
- 执行时机:每次Widget重建触发build时,都会调用
Get.put()(但不会重复创建Controller); - 作用域:变量仅在build方法内部可用,类中其他方法无法访问;
- 适用场景:仅在build方法内需要用到该Controller时使用,代码更紧凑。
方式二:类成员变量声明
class PlaySongScreenHeader extends StatelessWidget { PlaySongScreenHeader({Key? key}) : super(key: key); //declaring inside class SongPlayerController songPlayerController=Get.put(SongPlayerController()); @override Widget build(BuildContext context) { // ... } }
- 执行时机:仅在Widget实例化(创建对象)时执行一次
Get.put(),后续Widget重建不会再执行; - 作用域:变量属于类成员,类中所有方法(比如自定义工具方法)都能访问;
- 注意点:如果该Widget被多次实例化(比如ListView中生成多个实例),每次实例化都会调用
Get.put(),但依然不会重复创建Controller——GetX会复用已注册的实例。
内容的提问来源于stack exchange,提问作者user22362195
相关产品推荐
相关产品推荐

