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

Flutter中如何将SharedPreferences按不同作用域存储且不覆盖旧值?

问题原因

当前setAppStringValue方法的实现逻辑是每次写入时创建仅包含当前传入键值对的新对象,直接覆盖SharedPreferences中APP_DATA对应的全部存储内容,没有保留原有已存储的其他字段,因此会出现旧字段被覆盖的问题。

修复方案

修改setAppStringValue方法,先读取原有存储的APP_DATA内容,合并新的键值对后再整体写入,修改后的代码如下:

setAppStringValue(String key, String value) async {
  SharedPreferences myPrefs = await SharedPreferences.getInstance();
  // 读取已存储的APP_DATA原有内容
  String? oldAppData = myPrefs.getString("APP_DATA");
  Map<String, dynamic> appDataMap = {};
  if (oldAppData != null) {
    appDataMap = jsonDecode(oldAppData);
  }
  // 合并新的键值对,原有字段不会丢失
  appDataMap[key] = value;
  // 写入合并后的完整数据
  await myPrefs.setString("APP_DATA", jsonEncode(appDataMap));
}

存储USER_DATA的对应写入方法也需要按照相同逻辑修改,先读原有用户数据、合并新字段后再写入。

可选优化建议
  • 可以给读写逻辑增加异常捕获,避免JSON解析失败导致程序崩溃
  • 若单字段修改频率很高,可以直接把二级key拼接到SharedPreferences的一级key上(例如APP_DATA_banners),无需每次读写都序列化/反序列化整个对象,性能表现更好
  • 需要删除某个字段时,调用appDataMap.remove(key)后再执行写入操作即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:24:03