【发布时间】:2018-06-15 10:52:30
【问题描述】:
有没有一种方法可以将地图对象保存到共享首选项中,以便我们可以从共享首选项中获取数据,而不是一直监听数据库。 实际上我想减少从 firebase 下载的数据量。所以我正在考虑一个解决方案,让一个共享首选项的侦听器并从共享首选项中读取数据。
但我没有看到在颤振或飞镖中实现这一目标的方法。
如果有解决方法,请有人帮我实现这一目标。
非常感谢, 马希
【问题讨论】:
有没有一种方法可以将地图对象保存到共享首选项中,以便我们可以从共享首选项中获取数据,而不是一直监听数据库。 实际上我想减少从 firebase 下载的数据量。所以我正在考虑一个解决方案,让一个共享首选项的侦听器并从共享首选项中读取数据。
但我没有看到在颤振或飞镖中实现这一目标的方法。
如果有解决方法,请有人帮我实现这一目标。
非常感谢, 马希
【问题讨论】:
如果转换成字符串,可以存储
import 'dart:convert';
...
var s = json.encode(myMap);
// or var s = jsonEncode(myMap);
json.decode(...)/jsonDecode(...) 在加载时从字符串生成映射。
【讨论】:
使用此软件包可能会更容易: 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();
}
软件包仍在开发中,因此可能会发生变化,但欢迎任何改进和想法! :)
【讨论】:
对于那些不喜欢将 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);
}
...
希望这会有所帮助!
【讨论】:
在 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"));
【讨论】: