GetX框架下修改ListTile绑定对象状态后UI未更新问题咨询
问题原因
- 第一,GetX中
update()方法是配合GetBuilder手动更新组件使用的,你界面用了响应式监听组件Obx,调用update()完全不会触发Obx的刷新逻辑。 - 第二,
RxList默认仅监听列表自身的增、删、替换元素等操作,不会深度监听列表内部单个对象的属性变化,你仅修改SaveGame实例的属性,RxList感知不到变动,不会发送更新通知。 - 第三,注意属性匹配:你代码中修改的是
saveGame.working = true,但列表条目判断的是saveGame.isLoading,如果SaveGame类中isLoading没有和working做关联,就算UI刷新也不会展示加载状态。
解决方法
方案1:保持现有Obx响应式用法(推荐)
选以下任意一种方式即可:
- 给
SaveGame类的状态属性加响应式包装:把isLoading(或working)定义为RxBool类型:
列表条目判断时直接读class SaveGame { RxBool isLoading = false.obs; // 其他属性... }saveGame.isLoading.value即可,修改时直接改saveGame.isLoading.value = true,不需要额外操作,Obx会自动监听这个属性的变化刷新对应条目。 - 不想修改
SaveGame类的话,修改完对象属性后手动触发RxList刷新:void process(SaveGame saveGame) { saveGame.working = true; // 手动触发RxList更新通知 saveGames.refresh(); } - 把修改后的对象重新赋值到列表对应位置,让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
相关产品推荐
相关产品推荐

