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

GetxController内List在GetBuilder中返回空值问题求助

问题根源

你创建了多个BankController实例,导致数据存储在一个实例里,而UI获取的是另一个空实例的数据:

  • getBanks()里的BankController().getBanks():新建了一个控制器实例,数据存在这个实例里
  • Get.find<BankController>():获取的是全局注册的单例实例(空数据)
  • GetBuilder里的init: BankController():又新建了第三个控制器实例(空数据)
修复步骤

1. 修正控制器内的Repo获取方式

控制器里直接new BankRepo不符合Getx依赖注入规范,改为通过Get.find获取注册的单例:

class BankController extends GetxController implements GetxService {
  // 替换直接new的方式,使用Getx依赖注入获取Repo
  BankRepo bankRepo = Get.find<BankRepo>();
  List<Bank> banks = [];

  Future<void> getBanks() async {
    ResponseModel response = await bankRepo.banks();
    if (response.statusCode == 200) {
      banks = (response.data as List).map((e) => Bank.fromJson(e)).toList();
      update(); // 通知GetBuilder刷新UI
    }
  }
}

2. 修正add_bank.dart中的getBanks方法

不要新建控制器实例,直接获取全局注册的单例调用方法:

getBanks() async {
  // 获取全局注册的控制器实例
  BankController ctn = Get.find<BankController>();
  await ctn.getBanks();
  print(ctn.banks); // 现在能拿到正确数据
}

3. 修正GetBuilder的初始化

因为已经在全局通过Get.lazyPut注册了控制器,GetBuilder不需要再手动初始化新实例,去掉init参数即可:

GetBuilder<BankController>(
  // 移除init: BankController(),使用全局注册的单例实例
  builder: (bankController) {
    print(bankController.banks); // 现在能拿到正确数据
    return Column(
      crossAxisAlignment: CrossAxisAlignment.stretch,
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        // ... 原有UI代码
      ],
    );
  },
),

额外优化(可选)

在AddBankView的initState里提前触发控制器初始化,确保Getx的懒加载机制生效:

@override
void initState() {
  // 提前获取控制器,触发lazyPut初始化
  Get.find<BankController>();
  getBanks();
  super.initState();
}
验证效果

完成以上修改后,所有操作的都是同一个BankController单例实例,调用getBanks后数据会存入该实例的banks列表,update()会通知GetBuilder刷新UI,Dropdown就能正确加载银行列表。

内容的提问来源于stack exchange,提问作者Brightcode

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 00:05:34