Flutter使用GetX时update()方法未通知GetBuilder刷新的问题咨询
问题根因
你在GetBuilder的initState回调中手动实例化了新的HoursController对象,调用loadHours方法更新状态的是这个临时创建的独立实例,和当前GetBuilder绑定、builder参数中接收的controller完全不属于同一个实例,状态更新自然无法同步到视图。
修复方案
你需要保证调用方法的Controller实例和GetBuilder绑定的是同一个,修改视图层代码如下:
GetBuilder<HoursController>( id: "hours", // 绑定当前GetBuilder关联的Controller实例,如已提前通过Get.put注册可省略该参数 init: HoursController(), initState: (_) { // 直接获取当前GetBuilder绑定的Controller实例调用方法,不要手动创建新实例 _.controller?.loadHours(kunde: this.kunde); }, builder: (controller) { if (controller.hours.isEmpty) { return Container( child: Text("Nothing"), ); } return ListView.builder( shrinkWrap: true, physics: ClampingScrollPhysics(), itemCount: controller.hours.length, itemBuilder: (BuildContext context, int index) { return ListTile( title: Text(controller.hours[index]), ); }); }, )
可选优化
因为你已经将hours声明为.obs响应式变量,可以直接使用Obx替代GetBuilder,不需要手动指定更新id、也不需要调用update方法触发刷新,代码更简洁:
- 提前注册Controller(可在页面初始化前执行):
Get.put(HoursController());
- 视图层代码:
Obx(() { final controller = Get.find<HoursController>(); if (controller.hours.isEmpty) { return Container(child: Text("Nothing")); } return ListView.builder( shrinkWrap: true, physics: ClampingScrollPhysics(), itemCount: controller.hours.length, itemBuilder: (_, index) => ListTile(title: Text(controller.hours[index])), ); })
- Controller中的
loadHours方法可删除update(["hours"])调用,obs变量更新会自动通知关联的Obx组件刷新。
内容的提问来源于stack exchange,提问作者Vueer
相关产品推荐
相关产品推荐

