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
相关产品推荐
相关产品推荐

