shared_preferences
是一个Flutter插件,它提供了一种简单的方式来在应用程序中存储和获取持久化的键值对数据。它可以用于存储应用程序的配置信息、用户偏好设置、登录状态等。
使用 shared_preferences
插件,你可以在应用程序中轻松地保存和读取数据,而无需处理底层的持久化细节。它基于平台的本地存储机制,例如Android中的SharedPreferences和iOS中的NSUserDefaults。
shared_preferences基本用法
以下是使用 shared_preferences
插件的基本操作:
1.添加依赖
在你的Flutter项目的 pubspec.yaml
文件中添加 shared_preferences
依赖。
dependencies:
shared_preferences: ^2.2.2
2.导入插件
在需要使用 shared_preferences
的文件中导入插件。
import 'package:shared_preferences/shared_preferences.dart';
3.存储数据
使用 SharedPreferences.getInstance()
方法获取 SharedPreferences
实例,并使用 setXxx()
方法存储数据。
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString('username', 'John');
prefs.setInt('age', 25);
4.读取数据
使用 SharedPreferences.getInstance()
方法获取 SharedPreferences
实例,并使用 getXxx()
方法读取数据。
SharedPreferences prefs = await SharedPreferences.getInstance();
String username = prefs.getString('username');
int age = prefs.getInt('age');
5.删除数据
使用 SharedPreferences.getInstance()
方法获取 SharedPreferences
实例,并使用 remove()
方法删除指定键的数据。
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.remove('username');
通过使用 shared_preferences
插件,你可以方便地在Flutter应用程序中存储和获取持久化的数据。请注意,这些数据是应用程序私有的,只能在当前设备上访问。
可视化管理shared_preferences中的key和value类型
看了上面shared_preferences的基本用法,我们会发现,直接使用时会导致定义的key特别分散。开发者无法一目了然的查看,现在shared_preferences中定义了哪些key,对应的value又是什么类型。
1.使用
await SharedPreferencesManager.instance.set(SharedPreferencesKey.didGuide, true);
bool? res = await SharedPreferencesManager.instance.get(SharedPreferencesKey.didGuide);
2.封装SharedPreferencesManager(不设置默认值)
import 'package:shared_preferences/shared_preferences.dart';
import 'package:app_teleprompter/support/extension/object_extension.dart';
/// 管理SharedPreferences的键和值。
class SharedPreferencesManager {
// 单例对象
static final SharedPreferencesManager _instance = SharedPreferencesManager._internal();
// SharedPreferences的实例
late final Future<SharedPreferences> _prefsFuture;
// 私有构造函数,用于创建类的单例实例
SharedPreferencesManager._internal() {
_prefsFuture = _init();
}
// 异步初始化,确保在使用SharedPreferences之前已完成初始化
Future<SharedPreferences> _init() async {
return SharedPreferences.getInstance();
}
// 提供一个getter来获取单例对象
static SharedPreferencesManager get instance => _instance;
// 使用泛型方法来获取键对应的值。
// 根据泛型参数T的类型,决定使用哪个SharedPreferences的getter方法。
Future<T?> get<T>(SharedPreferencesKey key) async {
final SharedPreferences prefs = await _prefsFuture; // 等待初始化完成
String keyString = key.toString();
// 尝试获取值,如果不存在则返回null
Object? value;
if (T == String) {
value = prefs.getString(keyString) as T?;
} else if (T == bool) {
value = prefs.getBool(keyString) as T?;
} else if (T == int) {
value = prefs.getInt(keyString) as T?;
} else if (T == double) {
value = prefs.getDouble(keyString) as T?;
} else if (T == List) {
// 特别注意:我们假设List类型指的是List<String>
value = prefs.getStringList(keyString) as T?;
} else {
// 如果类型不支持,则抛出异常
//throw Exception('Unsupported type');
}
// 如果找不到值,则返回null,否则返回值
return value as T?;
}
// 使用泛型方法设置值
Future<bool> set<T>(SharedPreferencesKey key, T value) async {
final SharedPreferences prefs = await _prefsFuture; // 等待初始化完成
String keyString = key.toString();
if (value is String) {
return prefs.setString(keyString, value);
} else if (value is bool) {
return prefs.setBool(keyString, value);
} else if (value is int) {
return prefs.setInt(keyString, value);
} else if (value is double) {
return prefs.setDouble(keyString, value);
} else if (value is List<String>) {
return prefs.setStringList(keyString, value);
} else {
//throw Exception('Unsupported type');
return false;
}
}
}
// MARK: 自定义方法
extension PrintHelperExtension on SharedPreferencesManager {}
/// 定义一个枚举,包含所有keys和它们对应的类型
enum SharedPreferencesKey {
didGuide(bool), // 引导状态的键,与布尔类型关联
isSubscribeValid(bool), // 订阅是否有效
themeMode(String);
// 存储枚举值关联的类型
final Type type;
// 枚举构造函数
const SharedPreferencesKey(this.type);
}
3.封装SharedPreferencesManager(设置默认值)
import 'package:shared_preferences/shared_preferences.dart';
/// 管理SharedPreferences的键和值。
class SharedPreferencesManager {
// 单例对象
static final SharedPreferencesManager _instance = SharedPreferencesManager._internal();
// SharedPreferences的实例
late final Future<SharedPreferences> _prefsFuture;
// 私有构造函数,用于创建类的单例实例
SharedPreferencesManager._internal() {
_prefsFuture = _init();
}
// 异步初始化,确保在使用SharedPreferences之前已完成初始化
Future<SharedPreferences> _init() async {
return await SharedPreferences.getInstance();
}
// 提供一个getter来获取单例对象
static SharedPreferencesManager get instance => _instance;
// 使用泛型方法来获取键对应的值。
// 根据泛型参数T的类型,决定使用哪个SharedPreferences的getter方法。
Future<T> get<T>(SharedPreferencesKey key) async {
final SharedPreferences prefs = await _prefsFuture; // 等待初始化完成
String keyString = key.toString();
// 尝试获取值,如果不存在则返回null
Object? value;
if (T == String) {
value = prefs.getString(keyString) ?? defaultValues[key] as T;
} else if (T == bool) {
value = prefs.getBool(keyString) ?? defaultValues[key] as T;
} else if (T == int) {
value = prefs.getInt(keyString) ?? defaultValues[key] as T;
} else if (T == double) {
value = prefs.getDouble(keyString) ?? defaultValues[key] as T;
} else if (T == List) {
// 特别注意:我们假设List类型指的是List<String>
value = prefs.getStringList(keyString) ?? defaultValues[key] as T;
} else {
// 如果类型不支持,则抛出异常
//throw Exception('Unsupported type');
}
// 如果找不到值,则返回null,否则返回值
return value as T;
}
// 使用泛型方法设置值
Future<bool> set<T>(SharedPreferencesKey key, T value) async {
final SharedPreferences prefs = await _prefsFuture; // 等待初始化完成
String keyString = key.toString();
if (value is String) {
return prefs.setString(keyString, value);
} else if (value is bool) {
return prefs.setBool(keyString, value);
} else if (value is int) {
return prefs.setInt(keyString, value);
} else if (value is double) {
return prefs.setDouble(keyString, value);
} else if (value is List<String>) {
return prefs.setStringList(keyString, value);
} else {
//throw Exception('Unsupported type');
return false;
}
}
// 这里定义所有默认值
// 默认值一定要包含完整,要为每个key对应一个默认值
static final Map<SharedPreferencesKey, Object> defaultValues = {
SharedPreferencesKey.didGuide: false,
SharedPreferencesKey.isSubscribeValid: false,
SharedPreferencesKey.fontSizeProgress: 0.45,
SharedPreferencesKey.fontColorHex: '#FFFFFFFF',
SharedPreferencesKey.backgroundColorHex: '#7F000000',
};
}
/// 定义一个枚举,包含所有keys和它们对应的类型
enum SharedPreferencesKey {
// 引导状态的键,与布尔类型关联
didGuide(bool),
// 订阅是否有效
isSubscribeValid(bool),
// 设置-字体大小进度(0~1乘以最大字体)
fontSizeProgress(double),
// 设置-字体颜色
fontColorHex(String),
// 设置-字体背景色
backgroundColorHex(String);
// 存储枚举值关联的类型
final Type type;
// 枚举构造函数
const SharedPreferencesKey(this.type);
}