You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 17:40:58