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

时间:2020-07-30 13:08:04

标签: android flutter sharedpreferences

我在用Flutter保存带有sharedPreference的列表时遇到问题,我有一个像这样的数组:

enter image description here

好,要保存列表“ TodosEventos”,请应用以下代码

SharedPreferences prefs = await SharedPreferences.getInstance(); 

await prefs.setStringList('events',todosEventos);

但是我在运行时遇到了这个问题

enter image description here

4 个答案:

答案 0 :(得分:0)

事件类不是字符串。我建议您将列表另存为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

答案 1 :(得分:0)

Shared Preferences基本上仅用于保存较小的值,通常是boolean类的值。

因此,如果您想做类似“ ToDoList”之类的事情,则有一个 pub.dev上有一个名为pref_dessert的好的软件包,它可以完成保存此类数据的任务。或者,您也可以使用sqflite软件包在用户的设备上建立脱机数据库。

如果数据量较小,我建议您使用pref_dessert。但是,如果复杂sqflite,则最好使用它。

答案 2 :(得分:0)

SharedPrefrences允许您存储json。

所以我建议在事件类中添加一个toMap()方法:

Map<String, dynamic> toMap() {
  return {
    'imagePath': imagePath,
    'title': title,
    'eventId': eventId,
    ...
  };
}

还有一个创建所有事件的映射的函数:

Map<String, dynamic> todoEventosMap() {
  Map<String, dynamci> map;
  todoEventos.forEach((event) {
    // eventId should be unique
    map[event.eventId] = event.toMap();
  });
  return 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时,将地图传递到工厂:

List<Event> todoEventos;

var events = json.decode(await prefs.getString('events')) as Map<String, dynamic>;

events.forEach((eventId, eventMap) => todoEventos.add(Event.fromMap(eventMap)));

答案 3 :(得分:0)

否,但间接地是 主要逻辑是,您只需要在存储时对列表进行编码,而在检索时进行解码。

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);
  }