【问题标题】:How to save list with sharedPreference in Flutter如何在 Flutter 中使用 sharedPreference 保存列表
【发布时间】:2020-07-30 13:08:04
【问题描述】:

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

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

SharedPreferences prefs = await SharedPreferences.getInstance(); 

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

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

【问题讨论】:

    标签: android flutter sharedpreferences


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      SharedPrefrences 允许您存储 json。

      所以我建议在 Event 类中添加一个 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】:

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

        【讨论】:

          【解决方案4】:

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

          所以,如果你想做类似“ToDoList”之类的事情,有一个 pub.dev 上提供的好包称为 pref_dessert,它完成了保存此类数据的任务。或者您也可以使用sqflite包在用户设备上制作离线数据库。

          我建议你使用pref_dessert,如果它会有少量数据。但是,如果它是复杂的,sqflite 会很好。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-11-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-03-02
            • 2021-05-19
            相关资源
            最近更新 更多