簡體   English   中英

如何在 Flutter 中使用 sharedPreference 保存列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM