【问题标题】:How to save List<Object> to SharedPreferences in Flutter?如何将 List<Object> 保存到 Flutter 中的 SharedPreferences?
【发布时间】:2020-08-02 14:04:29
【问题描述】:

我有一个最喜欢的音乐列表,我在第一次打开应用程序时从音乐中检索,应用程序从收藏夹中获取最喜欢的音乐列表。我想将此列表保存到共享

preferences.List<Music> favoriteMusic = new List<Music>();

音乐课在哪里:

class Music {
  final int id;
  final String name, size, rating, duration, img;
  bool favorite;

  Music({
    this.id,
    this.rating,
    this.size,
    this.duration,
    this.name,
    this.img,
    this.favorite,
  });

  factory Music.fromJson(Map<String, dynamic> jsonData){
    return Music(
      id: jsonData['id'],
      rating: jsonData['rating'],
      size: jsonData['size'],
      duration: jsonData['duration'],
      name: jsonData['name'],
      img: jsonData['img'],
      favorite: false,
    );
  }
}

如何保存喜爱的音乐列表?

【问题讨论】:

  • 您可以在保存时序列化您的对象,并在检索时对其进行反序列化。
  • @Hamed 很抱歉,但是你能帮我序列化吗,我是新来的,对此有一些问题?
  • 我添加了一个答案。

标签: flutter sharedpreferences


【解决方案1】:

你应该做这些步骤

保存对象:

  1. 使用toMap() 方法将您的对象转换为映射
  2. 使用encode(...) 方法将您的地图编码为字符串
  3. 将字符串保存到共享首选项

用于恢复您的对象:

  1. 使用decode(...) 方法将共享首选项字符串解码为映射
  2. 使用fromJson() 方法获取您的对象

更新完整样本

import 'dart:convert';

void main() async {
  final SharedPreferences prefs = await SharedPreferences.getInstance();
  
  // Encode and store data in SharedPreferences
  final String encodedData = Music.encode([
    Music(id: 1, ...),
    Music(id: 2, ...),
    Music(id: 3, ...),
  ]);

  await prefs.setString('musics_key', encodedData);

  // Fetch and decode data
  final String musicsString = await prefs.getString('musics_key');

  final List<Music> musics = Music.decode(musicsString);
}

class Music {
  final int id;
  final String name, size, rating, duration, img;
  bool favorite;

  Music({
    this.id,
    this.rating,
    this.size,
    this.duration,
    this.name,
    this.img,
    this.favorite,
  });

  factory Music.fromJson(Map<String, dynamic> jsonData) {
    return Music(
      id: jsonData['id'],
      rating: jsonData['rating'],
      size: jsonData['size'],
      duration: jsonData['duration'],
      name: jsonData['name'],
      img: jsonData['img'],
      favorite: false,
    );
  }

  static Map<String, dynamic> toMap(Music music) => {
        'id': music.id,
        'rating': music.rating,
        'size': music.size,
        'duration': music.duration,
        'name': music.name,
        'img': music.img,
        'favorite': music.favorite,
      };

  static String encode(List<Music> musics) => json.encode(
        musics
            .map<Map<String, dynamic>>((music) => Music.toMap(music))
            .toList(),
      );

  static List<Music> decode(String musics) =>
      (json.decode(musics) as List<dynamic>)
          .map<Music>((item) => Music.fromJson(item))
          .toList();
}

【讨论】:

  • 此方法是否仅适用于 1 个对象?
  • 您可以轻松地将其展开为对象列表。你只需要创建一个地图列表。
  • 我非常爱你兄弟 :)))
  • 这实际上解决了我保存对象列表的问题,但是它仅在该对象具有原始数据类型作为其变量时才有效。在我的情况下, MyObject 中有一个 List 作为变量。有什么解决办法吗?谢谢
  • 谢谢你,兄弟.. !!
【解决方案2】:

Flutter 的 shared_preferences 插件有一个方法:setStringList(String key, List&lt;String&gt; value),所以你可以为你的对象编写序列化器。

【讨论】:

  • 谢谢。请您举例说明如何检索以这种方式存储的数据?
【解决方案3】:

转成字符串,可以存储

import 'dart:convert';
...
var s = json.encode(myList);
// or var s = jsonEncode(myList);

json.decode() //convert a string to List when you load it

【讨论】:

  • 如果我想将字符串转换为列表,那么我该怎么做。拆分不是好方法,因为我得到列表的响应,然后将共享首选项保存为字符串,然后获取新屏幕此首选项但无法转换回列表
【解决方案4】:

对于像我这样想要更多地了解我们亲爱的朋友 Hamed 在他的回答中所做的魔法,或者想要将他的解决方案调整为具有列表/其他类的更复杂类的新手,请查看以下两个链接: https://bezkoder.com/dart-flutter-parse-json-string-array-to-object-list/

https://bezkoder.com/dart-flutter-convert-object-to-json-string/

jsonEncode() 和 jsonDecode() 与 json.encode() 和 json.decode() 相同

【讨论】:

    【解决方案5】:

    只需在共享首选项中使用字符串列表

    basic syntax:
    
        // read
        final myStringList = prefs.getStringList('my_string_list_key') ?? [];
        // write
        prefs.setStringList('my_string_list_key', ['a', 'b', 'c']);
    

    首先将对象转换为地图。然后使用 jsonEncode 将地图转换为 JSON 字符串,最后将 JSON 字符串保存到共享首选项

    Sample example:
    
            // import 'dart:convert';
        Person person = Person('Mary', 30);
        Map<String, dynamic> map = {
          'name': person.name,
          'age': person.age
        };
        String rawJson = jsonEncode(map);
        prefs.setString('my_string_key', rawJson);
    
     
    

    在检索数据时

     final rawJson = prefs.getString('my_string_key') ?? '';
    Map<String, dynamic> map = jsonDecode(rawJson);
    final person = Person(map['name', map['age']);
    

    【讨论】:

      猜你喜欢
      • 2015-03-22
      • 1970-01-01
      • 2020-10-20
      • 1970-01-01
      • 2021-10-21
      • 2021-04-26
      • 2022-12-09
      • 2019-10-05
      • 2021-10-11
      相关资源
      最近更新 更多