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
相关产品推荐
相关产品推荐

