【问题标题】:Can i store a Map<String, Object> inside a Shared Preferences in dart?我可以将 Map<String, Object> 存储在飞镖的共享首选项中吗?
【发布时间】:2018-06-15 10:52:30
【问题描述】:

有没有一种方法可以将地图对象保存到共享首选项中,以便我们可以从共享首选项中获取数据,而不是一直监听数据库。 实际上我想减少从 firebase 下载的数据量。所以我正在考虑一个解决方案,让一个共享首选项的侦听器并从共享首选项中读取数据。

但我没有看到在颤振或飞镖中实现这一目标的方法。

如果有解决方法,请有人帮我实现这一目标。

非常感谢, 马希

【问题讨论】:

    标签: dart flutter


    【解决方案1】:

    如果转换成字符串,可以存储

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

    json.decode(...)/jsonDecode(...) 在加载时从字符串生成映射。

    【讨论】:

    • 这太棒了,非常感谢@GunterZochbauer,这非常有效。
    • 这正是我自己使用的解决方案,很好;)
    • 我可以在共享首选项中保存一个 List 吗?
    • 不,只有 JSON。您需要先对其进行编码。 Shared Preferences 是存储在您的应用程序之外,通常只有序列化数据可以存储在应用程序之外,而不仅仅是普通对象。
    • 无法转成字符串
    【解决方案2】:

    使用此软件包可能会更容易: https://pub.dartlang.org/packages/pref_dessert

    看例子:

    import 'package:pref_dessert/pref_dessert.dart';
    
    /// Person class that you want to serialize:
    class Person {
      String name;
      int age;
    
      Person(this.name, this.age);
    }
    
    /// PersonDesSer which extends DesSer<T> and implements two methods which serialize this objects using CSV format:
    class PersonDesSer extends DesSer<Person>{
      @override
      Person deserialize(String s) {
        var split = s.split(",");
        return new Person(split[0], int.parse(split[1]));
      }
    
      @override
      String serialize(Person t) {
        return "${t.name},${t.age}";
      }
    
    }
    
    void main() {
      var repo = new FuturePreferencesRepository<Person>(new PersonDesSer());
      repo.save(new Person("Foo", 42));
      repo.save(new Person("Bar", 1));
      var list = repo.findAll();
    
    }
    

    软件包仍在开发中,因此可能会发生变化,但欢迎任何改进和想法! :)

    【讨论】:

      【解决方案3】:

      对于那些不喜欢将 String 转换为 JSON 或反之亦然的人,个人推荐 localstorage,这是我找到的在 Flutter 中存储任何 data&lt;T&gt; 的最简单方法。

      import 'package:localstorage/localstorage.dart';
      
      final LocalStorage store = new LocalStorage('myapp');
      
      ...
      
      setLocalStorage() async {
        await store.ready;       // Make sure store is ready
        store.setItem('myMap', myMapData);
      }
      
      ...
      
      

      希望这会有所帮助!

      【讨论】:

      • 你到底是怎么得到那个的?使用 getItem?
      【解决方案4】:

      在 dart 的 Shared Preferences 中,无法直接存储 Map,但您可以通过将 Map 转换为 String 并照常保存,然后在需要时检索字符串然后转换它回到Map。这么简单!

      使用json.encode()将您的地图转换为String,然后保存,

      当您需要地图时,请使用json.decode() 从字符串中取回您的地图。

      import 'dart:convert';
      import 'package:shared_preferences/shared_preferences.dart';
      
      final yourStr = sharedPreferences.getString("yourkey");
      var map = json.decode(yourStr);
      
      sharedPreferences.setString("yourkey", json.encode("value"));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-21
        • 2011-09-03
        • 2016-04-04
        • 2013-01-28
        相关资源
        最近更新 更多