Szhangbiao's blog

记录一些让自己可以回忆的东西

0%

Flutter本地存储之SharedPreferences

Flutter 的 shared_preferences 库的作用是将数据以键值对的形式异步持久化到磁盘支持的数据类型有 int、double、bool、string、stringList,对于非 Web 平台删除 App 后数据会被清除,对于 Web 平台清除浏览器缓存后数据会被清除。

在各个平台上的实现

shared_preferences在各个平台上的实现有:

平台 实现类
Android SharedPreferences
iOS NSUserDefaults
Linux FileSystem
Windows FileSystem
macOS NSUserDefaults
Web LocalStorage

项目实战中的使用

在我个人的项目里用到了 injectable搭配get_it来做依赖注入,用法跟 Android 中的Hilt非常像。简单熟悉下就可以上手,这对于我这个 Android 开发来说非常的舒服。
首先在module类里提供实例

1
2
3
4
5
6
7
8
import 'package:injectable/injectable.dart';
@module
abstract class AppModule {

@preResolve
@lazySingleton
Future<SharedPreferences> get prefs => SharedPreferences.getInstance();
}

其次是在LocalStorage类里

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import 'package:shared_preferences/shared_preferences.dart';
import 'package:injectable/injectable.dart';

abstract class LocalStorage {
String? get userId;
void storeUserId(String? userId);
Future<void> storeUserIdAsync(String? userId);
}

const String _KEY_USER_ID = "user_id";

@LazySingleton(as: LocalStorage)
class LocalStorageImpl implements LocalStorage {
final SharedPreferences _prefs;
const LocalStorageImpl(this._prefs);

@override
String? get userId => _prefs.getString(_KEY_USER_ID);

@override
void storeUserId(String? userId) {
if (userId?.isNotEmpty == true) {
_prefs.setString(_KEY_USER_ID, userId!);
}
}

@override
Future<void> storeUserIdAsync(String? userId) async {
if (userId?.isNotEmpty == true) {
await _prefs.setString(_KEY_USER_ID, userId!);
}
}
}

这里使用 abstract class 的方式是从 Android 开发那边继承过来的,也可以当做本人在使用 SharePreferences 上的一种习惯。

其他一些容易忽视的使用方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import 'package:shared_preferences/shared_preferences.dart';
SharedPreferences prefs = await SharedPreferences.getInstance();
// 获取持久化数据数据中所有存入的key
List<String> keys = prefs.getKeys().toList();

// 判断持久化数据数据中是否包含某个key
bool? containKey = prefs.containsKey("someKey")

// 删除持久化数据中某个key
bool? removeKey = await prefs.remove("someKey");

// 清除所有持久化数据
bool clearAllKey = await prefs.clear() ;

// 重新加载所有数据(仅重载运行时)
await prefs.reload();

总结

当我们需要对数据进行持久化储存的时候,我们可以采用 shared_preferences 来进行储存到磁盘,这样 app 启动时可访问储存后的数据,支持存储多种类型,使用简单方便且全平台支持。