starwork_flutter/lib/common/utils/shared_preferences_utils.dart

84 lines
2.2 KiB
Dart
Raw Normal View History

2025-08-27 18:20:37 +08:00
import 'package:shared_preferences/shared_preferences.dart';
2025-09-02 11:45:38 +08:00
import 'dart:async';
2025-08-27 18:20:37 +08:00
class SharedPreferencesUtils {
static SharedPreferences? _prefs;
// 初始化
static Future<void> init() async {
_prefs = await SharedPreferences.getInstance();
}
2025-09-02 11:45:38 +08:00
/// 存储带过期时间的字符串
/// [key] 键
/// [value] 值
/// [expiry] 过期时间(如 Duration(hours: 1)
static Future<bool> setStringWithExpiry(
2025-09-06 15:42:26 +08:00
String key,
String value,
Duration expiry,
) async {
2025-09-02 11:45:38 +08:00
final prefs = _prefs;
if (prefs == null) return false;
final expiryKey = '_expiry_$key'; // 用 _expiry_ 前缀标记过期时间
final expireAt = DateTime.now().add(expiry).millisecondsSinceEpoch;
// 使用 Transaction 确保原子性(可选)
return await prefs.setString(key, value) &&
await prefs.setInt(expiryKey, expireAt);
}
/// 获取带过期时间的字符串
/// 如果已过期,则自动删除并返回 null
static String? getStringWithExpiry(String key) {
final prefs = _prefs;
if (prefs == null) return null;
final expiryKey = '_expiry_$key';
final expireAt = prefs.getInt(expiryKey);
// 如果没有过期时间,视为永不过期(或已过期?根据需求)
if (expireAt == null) {
return prefs.getString(key);
}
// 比较当前时间
final now = DateTime.now().millisecondsSinceEpoch;
if (now > expireAt) {
// 已过期,清理
removeKeyWithExpiry(key);
return null;
}
return prefs.getString(key);
}
/// 删除带过期时间的键(清理 value 和 expiry
static Future<void> removeKeyWithExpiry(String key) async {
final prefs = _prefs;
if (prefs == null) return;
final expiryKey = '_expiry_$key';
await prefs.remove(key);
await prefs.remove(expiryKey);
}
2025-08-27 18:20:37 +08:00
static Future<bool> setString(String key, String value) async {
return _prefs?.setString(key, value) ?? Future.value(false);
}
static String? getString(String key) {
return _prefs?.getString(key);
}
2025-09-06 15:42:26 +08:00
// bool
static Future<void> setBool(String key, dynamic value) async {
_prefs?.setBool(key, value);
}
static Future<bool?> getBool(String key) async {
return _prefs?.getBool(key);
}
}