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();
List<String> keys = prefs.getKeys().toList();
bool? containKey = prefs.containsKey("someKey")
bool? removeKey = await prefs.remove("someKey");
bool clearAllKey = await prefs.clear() ;
await prefs.reload();
|
总结
当我们需要对数据进行持久化储存的时候,我们可以采用 shared_preferences 来进行储存到磁盘,这样 app 启动时可访问储存后的数据,支持存储多种类型,使用简单方便且全平台支持。