enum LocalStorageKeys { tutorialCompleted, user }
@singleton
class LocalStorageRepository {
const LocalStorageRepository(SharedPreferences prefs) : _prefs = prefs;
final SharedPreferences _prefs;
bool keyExists(String key) => _prefs.containsKey(key);
T? getValue<T>(
LocalStorageKeys key, [
T Function(Map<String, dynamic>)? fromJson,
]) {
switch (T) {
case int:
return _prefs.getInt(key.name) as T?;
case double:
return _prefs.getDouble(key.name) as T?;
case String:
return _prefs.getString(key.name) as T?;
case bool:
return _prefs.getBool(key.name) as T?;
default:
assert(fromJson != null, 'fromJson must be provided for Object values');
if (fromJson != null) {
final stringObject = _prefs.getString(key.name);
if (stringObject == null) return null;
final jsonObject = jsonDecode(stringObject) as Map<String, dynamic>;
return fromJson(jsonObject);
}
}
return null;
}
void setValue<T>(LocalStorageKeys key, T value) {
switch (T) {
case int:
_prefs.setInt(key.name, value as int);
break;
case double:
_prefs.setDouble(key.name, value as double);
break;
case String:
_prefs.setString(key.name, value as String);
break;
case bool:
_prefs.setBool(key.name, value as bool);
break;
default:
assert(
value is Map<String, dynamic>,
'value must be int, double, String, bool or Map<String, dynamic>',
);
final stringObject = jsonEncode(value);
_prefs.setString(key.name, stringObject);
}
}
}
7条答案
按热度按时间dgsult0t1#
您可以将对象存储在共享首选项中,如下所示:
ac1kyiln2#
搜索了很多文章后,你在这里
要将数据保存到SharedPreferences示例,必须将对象转换为JSON:
要从SharedPreferences示例获取数据,对象必须从JSON转换:
fcg9iug33#
将对象保存到共享首选项
从共享首选项中获取对象
您将需要导入下面提到的包
创建模型的最简单方法按照此答案-〉https://stackoverflow.com/a/58708634/9236994
zi8p0yeb4#
保存前需要将其序列化为JSON,阅读后需要反序列化
详情请参见https://flutter.io/docs/development/data-and-backend/json
iqih9akk5#
从API获取数据并将其保存到Shareperference时
我创建了一个用于获取详细信息的函数*您可以在应用程序中的任何位置调用此函数 *
现在,我在类中调用它以获取用户名
piwo6bdm6#
共享首选项处理程序
我创建了一个
LocalStorageRepository
类,它负责使用SharedPreferences
处理本地数据。该类是动态的,可以使用泛型和JSON解码和编码处理任何类型的数据(int、double、bool、String和Object)。
为了防止pron错误,我添加了
LocalStorageKeys
枚举来处理支持的键。如果您想从
LocalStorageRepository
获取Object值,则需要提供其fromJson
解码器。希望这个例子能对其他人有所帮助。
请随意编辑此问题并提出更改建议。
qxgroojn7#
如果从API获取数据,则最初从API端点获取的是字符串,因此可以将数据存储为原始字符串,并且在需要时可以对其进行反序列化并在需要使用它的位置使用
https://gist.github.com/k1ycee/33bb7e51dac81093f949bbd30d7d0dc9
类似这样的东西,我觉得缺点是,如果JSON字符串数据太多,可能不建议存储所有的字符串,而是将其反序列化,并采取您认为必要的。