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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 23:25:11