example/lib/manager/sp_manager.dart (95 lines of code) (raw):
// Copyright © 2025 Alibaba Cloud. All rights reserved.
//
// Author: keria
// Date: 2025/2/19
// Brief: SharedPreferences 管理工具类
import 'dart:async';
import 'package:shared_preferences/shared_preferences.dart';
/// SharedPreferences 管理工具类(单例模式)
/// 采用懒加载方式,无需显式初始化
class SPManager {
// 私有构造函数,防止外部实例化
SPManager._internal() {
_initPrefs();
}
// 单例实例
static final SPManager _instance = SPManager._internal();
// 获取单例实例
static SPManager get instance => _instance;
// SharedPreferences 实例
SharedPreferences? _prefs;
// 初始化标志
bool _initialized = false;
// 等待初始化完成的Completer列表
final List<Function(SharedPreferences)> _pendingCallbacks = [];
// 初始化SharedPreferences
void _initPrefs() {
SharedPreferences.getInstance().then((prefs) {
_prefs = prefs;
_initialized = true;
// 处理等待中的回调
for (var callback in _pendingCallbacks) {
callback(prefs);
}
_pendingCallbacks.clear();
});
}
// 获取SharedPreferences实例,确保已初始化
void _ensureInitialized(Function(SharedPreferences) callback) {
if (_initialized && _prefs != null) {
callback(_prefs!);
} else {
_pendingCallbacks.add(callback);
// 如果尚未开始初始化,则开始初始化
if (_prefs == null && !_initialized && _pendingCallbacks.length == 1) {
_initPrefs();
}
}
}
/// 保存 String 类型的值
Future<bool> saveString(String key, String value) async {
return _saveOperation((prefs) => prefs.setString(key, value));
}
/// 获取 String 类型的值
String? getString(String key) {
return _getOperation((prefs) => prefs.getString(key));
}
/// 保存 int 类型的值
Future<bool> saveInt(String key, int value) async {
return _saveOperation((prefs) => prefs.setInt(key, value));
}
/// 获取 int 类型的值
int? getInt(String key) {
return _getOperation((prefs) => prefs.getInt(key));
}
/// 保存 double 类型的值
Future<bool> saveDouble(String key, double value) async {
return _saveOperation((prefs) => prefs.setDouble(key, value));
}
/// 获取 double 类型的值
double? getDouble(String key) {
return _getOperation((prefs) => prefs.getDouble(key));
}
/// 保存 bool 类型的值
Future<bool> saveBool(String key, bool value) async {
return _saveOperation((prefs) => prefs.setBool(key, value));
}
/// 获取 bool 类型的值
bool? getBool(String key) {
return _getOperation((prefs) => prefs.getBool(key));
}
/// 保存 List<String> 类型的值
Future<bool> saveStringList(String key, List<String> value) async {
return _saveOperation((prefs) => prefs.setStringList(key, value));
}
/// 获取 List<String> 类型的值
List<String>? getStringList(String key) {
return _getOperation((prefs) => prefs.getStringList(key));
}
/// 删除指定 key 的值
Future<bool> remove(String key) async {
return _saveOperation((prefs) => prefs.remove(key));
}
/// 清空所有存储的数据
Future<bool> clearAll() async {
return _saveOperation((prefs) => prefs.clear());
}
// 通用保存操作
Future<bool> _saveOperation(
Future<bool> Function(SharedPreferences) operation,
) async {
Completer<bool> completer = Completer<bool>();
_ensureInitialized((prefs) async {
try {
bool result = await operation(prefs);
completer.complete(result);
} catch (e) {
completer.completeError(e);
}
});
return completer.future;
}
// 通用获取操作
T? _getOperation<T>(T? Function(SharedPreferences) operation) {
if (!_initialized || _prefs == null) {
// 如果尚未初始化,启动初始化并返回null
if (!_initialized) {
_initPrefs();
}
return null;
}
try {
return operation(_prefs!);
} catch (e) {
return null;
}
}
}