Flutter使用ValueListenableBuilder时ListView未更新UI问题

问题原因
ValueNotifier仅会监听其持有的值对象的引用变化,你直接调用storieList.value.add()仅修改了List内部的元素,List本身的内存引用没有发生改变,ValueNotifier无法感知到数据变更,也就不会触发ValueListenableBuilder的重建,因此UI不会同步更新。
修复方案
修改按钮点击事件逻辑,每次新增元素时生成一个新的List赋值给storieList.value,触发引用变化即可正常刷新UI:
createStorieAction() { // 基于原有列表生成新列表,追加新元素后重新赋值 storieList.value = [...storieList.value, StorieCard()]; print('new Value added to storie list'); }
如果需要直接修改原有列表的元素,可以在修改后手动触发更新通知(不推荐,不符合ValueNotifier的不可变值设计规范):
createStorieAction() { storieList.value.add(StorieCard()); // 手动触发更新通知,需忽略警告 // ignore: invalid_use_of_protected_member, invalid_use_of_visible_for_testing_member storieList.notifyListeners(); print('new Value added to storie list'); }
优化建议
不推荐直接将Widget组件存储在ValueNotifier中,更合理的实现是存储StorieCard对应的数据模型列表,在ValueListenableBuilder中根据数据动态生成StorieCard组件,可避免Widget缓存、状态错乱等后续问题。
内容的提问来源于stack exchange,提问作者Leskeboy
相关产品推荐
相关产品推荐

