我正在嘗試使用共享首選項以不同方式存盤應用程式資料和用戶資料,如下所示:
{
"APP_DATA": {
"banners": "{\"success\":true,\"data\":{}}",
"gameList": "{\"success\":true,\"data\":{}}"
},
"USER_DATA":
{
"emailVerified": "N",
"userName": "97144554455",
"playerToken": "W_8zUx3UCmFPeECjhhjhHhnnsajknHxAM0",
"idVerified": "UPLOADED",
"playerId": "412904",
"bankList": "{\"84\":\"African Bank\",\"5\":\"FNB : First National Bank\"}",
"unreadMsgCount": "0"
}
}
但是每當我更新“APP_DATA”或“USER_DATA”中的任何值時,它都會洗掉以前的值并更新新值。示例:將“banners”和“gamesList”添加到我的 APP_DATA 后,我只看到“gamesList”,因為它覆寫了“banners”值。
MySharedPreferences.instance.setAppStringValue(
"banners", jsonEncode(bannersModel),
);
MySharedPreferences.instance.setAppStringValue(
"gamesList", jsonEncode(gamesListModel),
);
這是我正在使用的功能
setAppStringValue(String key, String value) async {
SharedPreferences myPrefs = await SharedPreferences.getInstance();
myPrefs.setString("APP_DATA", jsonEncode({key: value}));
}
如何解決這個問題?
uj5u.com熱心網友回復:
正在發生的事情是您APP_DATA用一個全新的值(已編碼String)覆寫了鍵,這導致以前的資料丟失。
如果你想保持相同的結構,也就是說,有一個 forAPP_DATA和其他 for USER_DATA,都有自己的資料,你需要獲取以前存盤的資料并將新的資料附加到其中,以便確保你沒有不要失去它。
setAppStringValue(String key, String value) async {
SharedPreferences myPrefs = await SharedPreferences.getInstance();
final String storedData = myPrefs.get('APP_DATA');
final Map newData = {key: value};
try {
// Has previous data, decode it and append into the new one
if (storedData != null) {
newData.addAll(jsonDecode(storedData));
}
} catch (ex) {
print('Couldn\'t parse the stored data: $ex');
}
myPrefs.setString('APP_DATA', jsonEncode(newData));
}
uj5u.com熱心網友回復:
使用共享首選項時,它使用唯一鍵來識別相應資料的值。當您將資料寫入鍵 'APP_DATA' 時,它將覆寫整個字串值。要更改一個值而不覆寫其余值,您應該將其保存在不同的鍵中。像這樣,
setAppStringValue(String key, String value) async {
SharedPreferences myPrefs = await SharedPreferences.getInstance();
myPrefs.setString("banner", jsonEncode({key: value}));
}
setAppStringValue(String key, String value) async {
SharedPreferences myPrefs = await SharedPreferences.getInstance();
myPrefs.setString("gamesList", jsonEncode({key: value}));
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/351832.html
