Flutter--shared_preferences缓存封装

该文介绍了在Flutter开发中如何利用官方库shared_preferences进行数据缓存,并提供了一个简单的缓存管理类UPCache的封装示例,便于后期替换其他缓存库。UPCache类包含了设置和获取不同类型数据的方法,以及预初始化的静态方法。

Flutter开发中缓存数据,我们可以使用官方提供的shared_preferences,在实际项目中需要将它封装一层,方便后续替换其他缓存库。

添加依赖:

dependencies:
  shared_preferences: ^2.1.1

封装管理类:

import 'package:shared_preferences/shared_preferences.dart';

/// @author huzhuwei
class UPCache {
SharedPreferences? _prefs;
static UPCache? _instance;

UPCache.of() {
  init();
}
UPCache._pre(SharedPreferences prefs) {
  _prefs = prefs;
}

static UPCache getInstance() {
  _instance ??= UPCache.of();
  return _instance!;
}

void init() async {
  _prefs ??= await SharedPreferences.getInstance();
}

static Future<UPCache> preInit() async {
  if (_instance == null) {
    var prefs = await SharedPreferences.getInstance();
    _instance = UPCache._pre(prefs);
  }
  return _instance!;
}

void setData<T>(String key, T data) {
  if (data is String) {
    _prefs?.setString(key, data);
  } else if (data is double) {
    _prefs?.setDouble(key, data);
  } else if (data is int) {
    _prefs?.setInt(key, data);
  } else if (data is bool) {
    _prefs?.setBool(key, data);
  } else if (data is List<String>) {
    _prefs?.setStringList(key, data);
  }
}

void remove(String key) {
  _prefs?.remove(key);
}

T? get<T>(String key) {
  var value = _prefs?.get(key);
  if (value != null) {
    return value as T;
  }
  return null;
}
}

使用:

在initState()中,预初始化

  
void initState() {
  super.initState();
  UPCache.preInit();
}
  void test() {
  UPCache.getInstance().setData("key1", "hhahahahah");
  UPCache.getInstance().setData("key2", 123);
  UPCache.getInstance().setData("key3", false);
  UPCache.getInstance().setData("key4", 11.1);
  var value1 = UPCache.getInstance().get("key1");
  var value2 = UPCache.getInstance().get("key2");
  var value3 = UPCache.getInstance().get("key3");
  var value4 = UPCache.getInstance().get("key4");
  print('value1:$value1');
  print('value2:$value2');
  print('value3:$value3');
  print('value4:$value4');
}
<think>我们正在讨论Flutter中的shared_preferences插件,用于轻量级数据持久化。 根据引用内容,shared_preferences是一个key-value存储系统,适用于存储小量数据,如用户配置和应用设置。 原理: shared_preferences在Android上使用SharedPreferences,在iOS上使用NSUserDefaults,在Web上使用window.localStorage。 它通过平台通道(Platform Channels)与原生平台通信,将数据存储在设备的本地存储中。 使用方法: 1. 添加依赖:在pubspec.yaml文件中添加shared_preferences插件的依赖。 2. 导入包:在Dart文件中导入shared_preferences包。 3. 使用:通过SharedPreferences类的静态方法获取实例,然后使用get和set方法读写数据。 下面是一个简单的示例代码,展示如何使用shared_preferences存储和读取数据。 注意:由于shared_preferences操作是异步的,因此我们需要使用await来等待操作完成。 我们将按照以下步骤编写代码: 1. 获取SharedPreferences实例。 2. 使用set方法存储数据(支持多种数据类型:int, double, bool, String, List<String>)。 3. 使用get方法读取数据。 此外,我们还需要注意错误处理,因为读取和写入可能会失败。 下面是一个完整的示例:</think>### Flutter shared_preferences 数据持久化原理与使用指南 #### 一、核心原理 shared_preferences 本质是通过**平台通道(Platform Channel)** 调用原生存储机制: - **Android**:基于 `SharedPreferences` API(XML 文件存储)[^1] - **iOS**:基于 `NSUserDefaults`(plist 文件存储)[^2] - **Web**:基于 `window.localStorage`(浏览器本地存储) 数据以键值对(key-value)形式存储,支持基础数据类型:`int`, `double`, `bool`, `String`, `List<String>`。 #### 二、使用步骤 1. **添加依赖**(pubspec.yaml) ```yaml dependencies: shared_preferences: ^2.2.3 # 使用最新版本 ``` 2. **基本操作** ```dart import 'package:shared_preferences/shared_preferences.dart'; // 存储数据 Future<void> saveData() async { final prefs = await SharedPreferences.getInstance(); await prefs.setInt('counter', 42); // 整型 await prefs.setBool('isDarkMode', true); // 布尔值 await prefs.setStringList('tags', ['Flutter', 'Dart']); // 字符串列表 } // 读取数据 Future<void> loadData() async { final prefs = await SharedPreferences.getInstance(); final counter = prefs.getInt('counter') ?? 0; // 默认值 final isDark = prefs.getBool('isDarkMode') ?? false; final tags = prefs.getStringList('tags') ?? []; } // 删除数据 Future<void> removeData() async { final prefs = await SharedPreferences.getInstance(); await prefs.remove('counter'); // 删除单个键 await prefs.clear(); // 清空所有数据 } ``` 3. **封装工具类**(推荐) ```dart class LocalStorage { static Future<void> setValue<T>(String key, T value) async { final prefs = await SharedPreferences.getInstance(); switch (T) { case int: prefs.setInt(key, value as int); break; case bool: prefs.setBool(key, value as bool); break; case String: prefs.setString(key, value as String); break; case double: prefs.setDouble(key, value as double); break; case List<String>: prefs.setStringList(key, value as List<String>); break; } } static Future<T?> getValue<T>(String key) async { final prefs = await SharedPreferences.getInstance(); return prefs.get(key) as T?; } } // 使用示例 LocalStorage.setValue('username', 'FlutterDev'); final name = await LocalStorage.getValue<String>('username'); ``` #### 三、最佳实践 1. **数据类型限制** - 只支持基础类型,复杂对象需序列化(如 JSON 转换) - 存储对象示例: ```dart // 存储对象 prefs.setString('user', jsonEncode(user.toJson())); // 读取对象 final json = prefs.getString('user'); final user = User.fromJson(jsonDecode(json!)); ``` 2. **性能优化** - 使用 `await SharedPreferences.getInstance()` 的**单例模式**(避免重复初始化) - 大数据量考虑 `hive` 或 `sqflite` 替代方案 3. **安全存储** - 敏感数据(如 token)应使用 `flutter_secure_storage` - 避免存储超过 2MB 数据(各平台限制不同) #### 四、适用场景 - ✅ 用户偏好设置(主题、语言) - ✅ 应用配置标记(首次启动标识) - ✅ 小型缓存数据(API 响应缓存- ❌ 关系型数据存储 - ❌ 大型文件或二进制数据 > 注意:Web 平台需检查存储配额(通常 5-10MB),移动端存储位置不可见但可通过设备文件管理器访问[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值