我可以在dart的共享首选项中存储Map <string,object =“”>吗?

时间:2018-01-05 15:37:38

标签: dart flutter

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

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

如果有解决方法,请有人帮助我实现此目的。

非常感谢, Mahi

4 个答案:

答案 0 :(得分:30)

如果将其转换为字符串,则可以存储

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

json.decode(...) / jsonDecode(...)在加载时会从字符串生成一个地图。

答案 1 :(得分:1)

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

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

当您需要地图时,请使用 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"));

答案 2 :(得分:0)

使用此软件包可能会更容易: 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 :(得分:0)

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

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

...

希望这会有所帮助!