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

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方法触发刷新,代码更简洁:

  1. 提前注册Controller(可在页面初始化前执行):
Get.put(HoursController());
  1. 视图层代码:
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])),
  );
})
  1. Controller中的loadHours方法可删除update(["hours"])调用,obs变量更新会自动通知关联的Obx组件刷新。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 12:45:02