|
@@ -1,3 +1,4 @@
|
|
|
|
|
+import 'dart:async';
|
|
|
import 'dart:convert';
|
|
import 'dart:convert';
|
|
|
import 'package:shared_preferences/shared_preferences.dart';
|
|
import 'package:shared_preferences/shared_preferences.dart';
|
|
|
import 'package:sino_med_cloud/core/constants/app_constants.dart';
|
|
import 'package:sino_med_cloud/core/constants/app_constants.dart';
|
|
@@ -5,17 +6,38 @@ import 'package:sino_med_cloud/core/constants/app_constants.dart';
|
|
|
/// 本地存储管理类
|
|
/// 本地存储管理类
|
|
|
class LocalStorage {
|
|
class LocalStorage {
|
|
|
static SharedPreferences? _prefs;
|
|
static SharedPreferences? _prefs;
|
|
|
|
|
+ static Completer<void>? _initCompleter;
|
|
|
|
|
|
|
|
/// 初始化本地存储
|
|
/// 初始化本地存储
|
|
|
static Future<void> init() async {
|
|
static Future<void> init() async {
|
|
|
- _prefs ??= await SharedPreferences.getInstance();
|
|
|
|
|
|
|
+ if (_prefs != null) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ _prefs = await SharedPreferences.getInstance();
|
|
|
|
|
+ _initCompleter?.complete();
|
|
|
|
|
+ _initCompleter = null;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- /// 获取 SharedPreferences 实例
|
|
|
|
|
- static SharedPreferences get prefs {
|
|
|
|
|
- if (_prefs == null) {
|
|
|
|
|
- throw Exception('LocalStorage not initialized. Call LocalStorage.init() first.');
|
|
|
|
|
|
|
+ /// 确保已初始化(自动初始化,如果未初始化则初始化)
|
|
|
|
|
+ static Future<void> _ensureInitialized() async {
|
|
|
|
|
+ if (_prefs != null) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 如果正在初始化,等待初始化完成
|
|
|
|
|
+ if (_initCompleter != null) {
|
|
|
|
|
+ await _initCompleter!.future;
|
|
|
|
|
+ return;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ // 开始初始化
|
|
|
|
|
+ _initCompleter = Completer<void>();
|
|
|
|
|
+ await init();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /// 获取 SharedPreferences 实例(内部使用)
|
|
|
|
|
+ static Future<SharedPreferences> get _prefsAsync async {
|
|
|
|
|
+ await _ensureInitialized();
|
|
|
return _prefs!;
|
|
return _prefs!;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -23,11 +45,13 @@ class LocalStorage {
|
|
|
|
|
|
|
|
/// 保存字符串
|
|
/// 保存字符串
|
|
|
static Future<bool> setString(String key, String value) async {
|
|
static Future<bool> setString(String key, String value) async {
|
|
|
|
|
+ final prefs = await _prefsAsync;
|
|
|
return await prefs.setString(key, value);
|
|
return await prefs.setString(key, value);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/// 获取字符串
|
|
/// 获取字符串
|
|
|
- static String? getString(String key, {String? defaultValue}) {
|
|
|
|
|
|
|
+ static Future<String?> getString(String key, {String? defaultValue}) async {
|
|
|
|
|
+ final prefs = await _prefsAsync;
|
|
|
return prefs.getString(key) ?? defaultValue;
|
|
return prefs.getString(key) ?? defaultValue;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -35,11 +59,13 @@ class LocalStorage {
|
|
|
|
|
|
|
|
/// 保存整数
|
|
/// 保存整数
|
|
|
static Future<bool> setInt(String key, int value) async {
|
|
static Future<bool> setInt(String key, int value) async {
|
|
|
|
|
+ final prefs = await _prefsAsync;
|
|
|
return await prefs.setInt(key, value);
|
|
return await prefs.setInt(key, value);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/// 获取整数
|
|
/// 获取整数
|
|
|
- static int? getInt(String key, {int? defaultValue}) {
|
|
|
|
|
|
|
+ static Future<int?> getInt(String key, {int? defaultValue}) async {
|
|
|
|
|
+ final prefs = await _prefsAsync;
|
|
|
return prefs.getInt(key) ?? defaultValue;
|
|
return prefs.getInt(key) ?? defaultValue;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -47,11 +73,13 @@ class LocalStorage {
|
|
|
|
|
|
|
|
/// 保存浮点数
|
|
/// 保存浮点数
|
|
|
static Future<bool> setDouble(String key, double value) async {
|
|
static Future<bool> setDouble(String key, double value) async {
|
|
|
|
|
+ final prefs = await _prefsAsync;
|
|
|
return await prefs.setDouble(key, value);
|
|
return await prefs.setDouble(key, value);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/// 获取浮点数
|
|
/// 获取浮点数
|
|
|
- static double? getDouble(String key, {double? defaultValue}) {
|
|
|
|
|
|
|
+ static Future<double?> getDouble(String key, {double? defaultValue}) async {
|
|
|
|
|
+ final prefs = await _prefsAsync;
|
|
|
return prefs.getDouble(key) ?? defaultValue;
|
|
return prefs.getDouble(key) ?? defaultValue;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -59,11 +87,13 @@ class LocalStorage {
|
|
|
|
|
|
|
|
/// 保存布尔值
|
|
/// 保存布尔值
|
|
|
static Future<bool> setBool(String key, bool value) async {
|
|
static Future<bool> setBool(String key, bool value) async {
|
|
|
|
|
+ final prefs = await _prefsAsync;
|
|
|
return await prefs.setBool(key, value);
|
|
return await prefs.setBool(key, value);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/// 获取布尔值
|
|
/// 获取布尔值
|
|
|
- static bool? getBool(String key, {bool? defaultValue}) {
|
|
|
|
|
|
|
+ static Future<bool?> getBool(String key, {bool? defaultValue}) async {
|
|
|
|
|
+ final prefs = await _prefsAsync;
|
|
|
return prefs.getBool(key) ?? defaultValue;
|
|
return prefs.getBool(key) ?? defaultValue;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -71,11 +101,13 @@ class LocalStorage {
|
|
|
|
|
|
|
|
/// 保存字符串列表
|
|
/// 保存字符串列表
|
|
|
static Future<bool> setStringList(String key, List<String> value) async {
|
|
static Future<bool> setStringList(String key, List<String> value) async {
|
|
|
|
|
+ final prefs = await _prefsAsync;
|
|
|
return await prefs.setStringList(key, value);
|
|
return await prefs.setStringList(key, value);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/// 获取字符串列表
|
|
/// 获取字符串列表
|
|
|
- static List<String>? getStringList(String key) {
|
|
|
|
|
|
|
+ static Future<List<String>?> getStringList(String key) async {
|
|
|
|
|
+ final prefs = await _prefsAsync;
|
|
|
return prefs.getStringList(key);
|
|
return prefs.getStringList(key);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -96,6 +128,7 @@ class LocalStorage {
|
|
|
try {
|
|
try {
|
|
|
// 将 Map 转换为 JSON 字符串保存
|
|
// 将 Map 转换为 JSON 字符串保存
|
|
|
final jsonString = jsonEncode(value);
|
|
final jsonString = jsonEncode(value);
|
|
|
|
|
+ final prefs = await _prefsAsync;
|
|
|
return await prefs.setString(key, jsonString);
|
|
return await prefs.setString(key, jsonString);
|
|
|
} catch (e) {
|
|
} catch (e) {
|
|
|
// 如果转换失败,返回 false
|
|
// 如果转换失败,返回 false
|
|
@@ -112,11 +145,12 @@ class LocalStorage {
|
|
|
///
|
|
///
|
|
|
/// 示例:
|
|
/// 示例:
|
|
|
/// ```dart
|
|
/// ```dart
|
|
|
- /// final user = LocalStorage.getMap('user');
|
|
|
|
|
|
|
+ /// final user = await LocalStorage.getMap('user');
|
|
|
/// // 返回:{'name': 'John', 'age': 30}
|
|
/// // 返回:{'name': 'John', 'age': 30}
|
|
|
/// ```
|
|
/// ```
|
|
|
- static Map<String, dynamic>? getMap(String key, {Map<String, dynamic>? defaultValue}) {
|
|
|
|
|
|
|
+ static Future<Map<String, dynamic>?> getMap(String key, {Map<String, dynamic>? defaultValue}) async {
|
|
|
try {
|
|
try {
|
|
|
|
|
+ final prefs = await _prefsAsync;
|
|
|
final jsonString = prefs.getString(key);
|
|
final jsonString = prefs.getString(key);
|
|
|
if (jsonString == null) {
|
|
if (jsonString == null) {
|
|
|
return defaultValue;
|
|
return defaultValue;
|
|
@@ -130,25 +164,86 @@ class LocalStorage {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // ==================== List 操作 ====================
|
|
|
|
|
+
|
|
|
|
|
+ /// 保存列表(List<Map<String, dynamic>>)
|
|
|
|
|
+ ///
|
|
|
|
|
+ /// [key] 存储的键
|
|
|
|
|
+ /// [value] 要保存的列表对象
|
|
|
|
|
+ ///
|
|
|
|
|
+ /// 返回保存是否成功
|
|
|
|
|
+ ///
|
|
|
|
|
+ /// 示例:
|
|
|
|
|
+ /// ```dart
|
|
|
|
|
+ /// await LocalStorage.setList('institutions', [
|
|
|
|
|
+ /// {'id': 10, 'name': '机构1'},
|
|
|
|
|
+ /// {'id': 20, 'name': '机构2'},
|
|
|
|
|
+ /// ]);
|
|
|
|
|
+ /// ```
|
|
|
|
|
+ static Future<bool> setList(String key, List<Map<String, dynamic>> value) async {
|
|
|
|
|
+ try {
|
|
|
|
|
+ // 将 List 转换为 JSON 字符串保存
|
|
|
|
|
+ final jsonString = jsonEncode(value);
|
|
|
|
|
+ final prefs = await _prefsAsync;
|
|
|
|
|
+ return await prefs.setString(key, jsonString);
|
|
|
|
|
+ } catch (e) {
|
|
|
|
|
+ // 如果转换失败,返回 false
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /// 获取列表(List<Map<String, dynamic>>)
|
|
|
|
|
+ ///
|
|
|
|
|
+ /// [key] 存储的键
|
|
|
|
|
+ /// [defaultValue] 默认值(可选)
|
|
|
|
|
+ ///
|
|
|
|
|
+ /// 返回列表对象,如果不存在或解析失败则返回 null 或默认值
|
|
|
|
|
+ ///
|
|
|
|
|
+ /// 示例:
|
|
|
|
|
+ /// ```dart
|
|
|
|
|
+ /// final institutions = await LocalStorage.getList('institutions');
|
|
|
|
|
+ /// // 返回:[{'id': 10, 'name': '机构1'}, {'id': 20, 'name': '机构2'}]
|
|
|
|
|
+ /// ```
|
|
|
|
|
+ static Future<List<Map<String, dynamic>>?> getList(String key, {List<Map<String, dynamic>>? defaultValue}) async {
|
|
|
|
|
+ try {
|
|
|
|
|
+ final prefs = await _prefsAsync;
|
|
|
|
|
+ final jsonString = prefs.getString(key);
|
|
|
|
|
+ if (jsonString == null) {
|
|
|
|
|
+ return defaultValue;
|
|
|
|
|
+ }
|
|
|
|
|
+ // 将 JSON 字符串解析为 List
|
|
|
|
|
+ final decoded = jsonDecode(jsonString) as List;
|
|
|
|
|
+ // 将 List 中的每个元素转换为 Map<String, dynamic>
|
|
|
|
|
+ return decoded.map((item) => item as Map<String, dynamic>).toList();
|
|
|
|
|
+ } catch (e) {
|
|
|
|
|
+ // 如果解析失败,返回默认值或 null
|
|
|
|
|
+ return defaultValue;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
// ==================== 通用操作 ====================
|
|
// ==================== 通用操作 ====================
|
|
|
|
|
|
|
|
/// 删除指定 key
|
|
/// 删除指定 key
|
|
|
static Future<bool> remove(String key) async {
|
|
static Future<bool> remove(String key) async {
|
|
|
|
|
+ final prefs = await _prefsAsync;
|
|
|
return await prefs.remove(key);
|
|
return await prefs.remove(key);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/// 清空所有数据
|
|
/// 清空所有数据
|
|
|
static Future<bool> clear() async {
|
|
static Future<bool> clear() async {
|
|
|
|
|
+ final prefs = await _prefsAsync;
|
|
|
return await prefs.clear();
|
|
return await prefs.clear();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/// 检查 key 是否存在
|
|
/// 检查 key 是否存在
|
|
|
- static bool containsKey(String key) {
|
|
|
|
|
|
|
+ static Future<bool> containsKey(String key) async {
|
|
|
|
|
+ final prefs = await _prefsAsync;
|
|
|
return prefs.containsKey(key);
|
|
return prefs.containsKey(key);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/// 获取所有 key
|
|
/// 获取所有 key
|
|
|
- static Set<String> getKeys() {
|
|
|
|
|
|
|
+ static Future<Set<String>> getKeys() async {
|
|
|
|
|
+ final prefs = await _prefsAsync;
|
|
|
return prefs.getKeys();
|
|
return prefs.getKeys();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -160,8 +255,8 @@ class LocalStorage {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/// 获取 Token
|
|
/// 获取 Token
|
|
|
- static String? getToken() {
|
|
|
|
|
- return getString(AppConstants.keyToken);
|
|
|
|
|
|
|
+ static Future<String?> getToken() async {
|
|
|
|
|
+ return await getString(AppConstants.keyToken);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/// 删除 Token
|
|
/// 删除 Token
|
|
@@ -175,13 +270,55 @@ class LocalStorage {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/// 获取用户信息
|
|
/// 获取用户信息
|
|
|
- static Map<String, dynamic>? getUserInfo() {
|
|
|
|
|
- return getMap(AppConstants.keyUserInfo);
|
|
|
|
|
|
|
+ static Future<Map<String, dynamic>?> getUserInfo() async {
|
|
|
|
|
+ return await getMap(AppConstants.keyUserInfo);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/// 删除用户信息
|
|
/// 删除用户信息
|
|
|
static Future<bool> removeUserInfo() async {
|
|
static Future<bool> removeUserInfo() async {
|
|
|
return await remove(AppConstants.keyUserInfo);
|
|
return await remove(AppConstants.keyUserInfo);
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ /// 保存机构信息列表
|
|
|
|
|
+ ///
|
|
|
|
|
+ /// [institutionInfo] 机构信息列表,格式为:
|
|
|
|
|
+ /// ```dart
|
|
|
|
|
+ /// [
|
|
|
|
|
+ /// {
|
|
|
|
|
+ /// "id": 10,
|
|
|
|
|
+ /// "uuid": "38a0d1fe-c08f-11f0-88d5-0242c0a80106",
|
|
|
|
|
+ /// "name": "仙豆仙豆"
|
|
|
|
|
+ /// }
|
|
|
|
|
+ /// ]
|
|
|
|
|
+ /// ```
|
|
|
|
|
+ ///
|
|
|
|
|
+ /// 返回保存是否成功
|
|
|
|
|
+ static Future<bool> saveInstitutionInfo(List<Map<String, dynamic>> institutionInfo) async {
|
|
|
|
|
+ return await setList(AppConstants.keyInstitutionInfo, institutionInfo);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /// 获取机构信息列表
|
|
|
|
|
+ ///
|
|
|
|
|
+ /// 返回机构信息列表,如果不存在或解析失败则返回 null
|
|
|
|
|
+ ///
|
|
|
|
|
+ /// 示例:
|
|
|
|
|
+ /// ```dart
|
|
|
|
|
+ /// final institutionInfo = await LocalStorage.getInstitutionInfo();
|
|
|
|
|
+ /// if (institutionInfo != null) {
|
|
|
|
|
+ /// for (var institution in institutionInfo) {
|
|
|
|
|
+ /// print('机构名称: ${institution['name']}');
|
|
|
|
|
+ /// }
|
|
|
|
|
+ /// }
|
|
|
|
|
+ /// ```
|
|
|
|
|
+ static Future<List<Map<String, dynamic>>?> getInstitutionInfo() async {
|
|
|
|
|
+ return await getList(AppConstants.keyInstitutionInfo);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /// 删除机构信息列表
|
|
|
|
|
+ ///
|
|
|
|
|
+ /// 返回删除是否成功
|
|
|
|
|
+ static Future<bool> removeInstitutionInfo() async {
|
|
|
|
|
+ return await remove(AppConstants.keyInstitutionInfo);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|