Flutter中用Riverpod维护全局Map<String, int>时数据丢失问题求助
问题解决:Riverpod全局Map Provider数据丢失
问题根源
你直接修改了state指向的Map内部值,但没有通过state = 新实例的方式更新状态引用。Riverpod依赖状态实例的替换来追踪状态变化,同时如果Provider没有设置持久化,当它因无监听被销毁后重建,build方法会返回空Map导致数据丢失。
修复方案
1. 正确更新状态(必须替换Map实例)
不要直接修改原Map,而是创建新的Map实例并赋值给state,让Riverpod感知状态变化:
@riverpod class ViewsCounterNotifier extends _$ViewsCounterNotifier { @override Map<String, int> build() { // 让Provider保持存活,避免无监听时被销毁 ref.keepAlive(); return {}; } void add(String id) { // 基于原状态创建新Map,完成计数更新 state = { ...state, id: (state[id] ?? 0) + 1, }; print(state); } }
或者用复制原Map的方式修改:
void add(String id) { final updatedMap = Map.from(state); updatedMap[id] = (updatedMap[id] ?? 0) + 1; state = updatedMap; // 关键:重新赋值state触发状态更新 print(state); }
2. 开启Provider持久化
在build方法中调用ref.keepAlive(),确保Provider不会因为没有组件监听而被销毁,避免重新执行build返回空Map。
原理说明
- Riverpod的Notifier状态是不可变优先的,只有当
state被赋值为新的实例时,才会触发状态更新通知,并保留当前状态。 ref.keepAlive()会阻止Provider在无监听时被回收,确保全局状态持续存在。
内容的提问来源于stack exchange,提问作者Ijk
相关产品推荐
相关产品推荐

