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

GetX框架下修改ListTile绑定对象状态后UI未更新问题咨询

问题原因

  • 第一,GetX中update()方法是配合GetBuilder手动更新组件使用的,你界面用了响应式监听组件Obx,调用update()完全不会触发Obx的刷新逻辑。
  • 第二,RxList默认仅监听列表自身的增、删、替换元素等操作,不会深度监听列表内部单个对象的属性变化,你仅修改SaveGame实例的属性,RxList感知不到变动,不会发送更新通知。
  • 第三,注意属性匹配:你代码中修改的是saveGame.working = true,但列表条目判断的是saveGame.isLoading,如果SaveGame类中isLoading没有和working做关联,就算UI刷新也不会展示加载状态。

解决方法

方案1:保持现有Obx响应式用法(推荐)

选以下任意一种方式即可:

  1. 给SaveGame类的状态属性加响应式包装:把isLoading(或working)定义为RxBool类型:
    class SaveGame {
      RxBool isLoading = false.obs;
      // 其他属性...
    }
    
    列表条目判断时直接读saveGame.isLoading.value即可,修改时直接改saveGame.isLoading.value = true,不需要额外操作,Obx会自动监听这个属性的变化刷新对应条目。
  2. 不想修改SaveGame类的话,修改完对象属性后手动触发RxList刷新:
    void process(SaveGame saveGame) {
      saveGame.working = true;
      // 手动触发RxList更新通知
      saveGames.refresh();
    }
    
  3. 把修改后的对象重新赋值到列表对应位置,让RxList监听到元素变动:
    void process(SaveGame saveGame) {
      final index = saveGames.indexOf(saveGame);
      if (index != -1) {
        saveGame.working = true;
        saveGames[index] = saveGame;
      }
    }
    

方案2:改用手动更新模式

把界面的Obx替换为GetBuilder<SaveGameController>,原有update()调用就会生效:

@override
Widget build(BuildContext context) {
  return Scaffold(
    key: scaffoldKey,
    body: GetBuilder<SaveGameController>(
      builder: (controller) => buildListView(context, controller)
    )
  );
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 02:24:03