[英]How to save list with sharedPreference in Flutter
我在 Flutter 中使用 sharedPreference 保存列表時遇到問題,我有一個這樣的數組:
好吧,要保存列表“TodosEventos”,請應用以下代碼
SharedPreferences prefs = await SharedPreferences.getInstance();
await prefs.setStringList('events',todosEventos);
但是我在運行時遇到了這個問題
不,但間接是的主要邏輯是您只需要在存儲時對列表進行編碼,在檢索時進行解碼。
SharedPreferences prefs = await SharedPreferences.getInstance();
await prefs.setStringList('events',generateList(todosEventos));
在這里您可以從列表中生成字符串
generateList(todosEventos) {
Map list;
todoEventos.foreach((element) {
list[element.id] = element.toMap();
});
return json.encode(list);
}
事件 class 不是字符串。 我建議你應該將列表保存為 JSON:
import 'dart:convert' show json;
import 'package:shared_preferences/shared_preferences.dart';
void setList(String key, List<dynamic> value) async {
await setString(key, json.encode(value));
}
setList('key', todosEventos);
這里討論了同樣的問題: Can i store a List<dynamic> with shared preference
Shared Preferences
基本上只用於保存較小的值,通常是boolean
類型的值。
因此,如果您想做類似“ToDoList”之類的事情,pub.dev 上有一個很好的package ,名為pref_dessert ,它可以完成保存此類數據的任務。 或者您也可以使用sqflite package 在用戶設備上制作離線數據庫。
我建議您使用pref_dessert
,如果它會有少量數據.. 但是,如果它是復雜的 sqflite 對sqflite
會很好。
SharedPrefrences 允許您存儲 json。
所以我建議在事件 class 中添加一個 toMap() 方法:
Map<String, dynamic> toMap() {
return {
'imagePath': imagePath,
'title': title,
'eventId': eventId,
...
};
}
還有一個 function 創建所有事件的 map:
Map<String, dynamic> todoEventosMap() {
Map<String, dynamci> map;
todoEventos.forEach((event) {
// eventId should be unique
map[event.eventId] = event.toMap();
});
return map;
}
然后您可以將 map 編碼為 json 並保存。
import 'dart:convert';
await prefs.setString('events', json.encode(todosEventosMap()));
要從 sharedPreferences 中取回列表:
您可以為 Event 添加一個方便的工廠方法:
factory Event.fromMap(Map<String,dynamic> map) {
return Event(
imagePath = map['imagePath'],
title = map['title'],
eventId = map['eventId'],
...
);
}
創建 todoEventos 時,將 map 傳遞給工廠:
List<Event> todoEventos;
var events = json.decode(await prefs.getString('events')) as Map<String, dynamic>;
events.forEach((eventId, eventMap) => todoEventos.add(Event.fromMap(eventMap)));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.