使用Flutter Get.put时出现意外输出,疑惑引用传递与Get.put原理
问题原因:Get.put的单例特性导致uc1和uc2指向同一实例
核心问题:GetX依赖管理的默认单例行为
- 第一次调用
Get.put(UserController())时,GetX会创建一个UserController实例,并将其作为单例存入依赖容器。 - 第二次调用
Get.put(UserController())时,GetX不会生成新实例,直接返回容器中已存在的那个。所以uc1和uc2本质是同一个对象的引用。
为什么修改uc2会影响uc1
因为uc1和uc2指向内存中的同一个UserController对象:
- 给
uc2.currentuser赋值为user2,实际是修改了这个唯一实例的currentuser属性。 - 后续访问
uc1.currentuser时,读取的是已经被修改后的属性值,自然输出xyz而非abc。
如何创建独立的多实例
如果需要多个互不影响的UserController实例,调用Get.put时传入唯一tag参数区分即可:
void main() { final uc1=Get.put(UserController(), tag: "uc1"); UserModel user1=UserModel(username: 'abc', password: 'a123'); uc1.currentuser=user1; print(uc1.currentuser!.username); // 输出abc final uc2=Get.put(UserController(), tag: "uc2"); UserModel user2=UserModel(username: 'xyz', password: 'x123'); uc2.currentuser=user2; print(uc2.currentuser!.username); // 输出xyz print(uc1.currentuser!.username); // 现在输出abc }
补充:和引用/值传递的关系
这个问题和byref/byval概念无关,核心是GetX的依赖管理机制。只有通过tag明确创建多实例时,各个控制器才会相互独立。
内容的提问来源于stack exchange,提问作者Irfan Ganatra
相关产品推荐
相关产品推荐

