news 2026/2/16 16:37:32

Flutter 结合 shared_preferences 2.5.4 实现本地轻量级数据存储

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Flutter 结合 shared_preferences 2.5.4 实现本地轻量级数据存储

在日常 Flutter 开发中,经常会遇到需要存储用户偏好设置、登录状态、简单配置项等轻量级数据的场景。这类数据无需复杂的数据库结构,但要求读写高效、跨平台兼容且接入成本低。此前我尝试过手动封装原生存储逻辑(如 Android 的 SharedPreferences、iOS 的 NSUserDefaults),但存在代码冗余、多平台适配繁琐的问题。了解到 shared_preferences 是 Flutter 生态中专门解决这类问题的官方推荐插件,而 2.5.4 版本作为稳定版,不仅修复了旧版本的异步读写缺陷,还优化了多平台存储逻辑,因此专门深入学习该版本的使用方式,旨在掌握轻量级本地存储的标准化实现方案,提升项目中数据持久化的开发效率,同时规避因缓存、跨隔离区访问导致的数据一致性问题。

Flutter 结合 shared_preferences 2.5.4 实现本地轻量级数据存储

技术背景与需求分析

  • 移动应用数据持久化的常见场景
  • shared_preferences 的定位与适用场景(轻量级键值对存储)
  • 对比其他本地存储方案(SQLite、Hive、文件存储)

shared_preferences 2.5.4 核心特性

  • 支持数据类型:intdoubleboolStringList<String>
  • 跨平台兼容性(iOS/Android/Web)
  • 同步与异步操作差异说明

环境配置与依赖集成

  • pubspec.yaml中添加依赖:
    dependencies: shared_preferences: ^2.5.4
  • 执行flutter pub get
  • 导入库:
    import 'package:shared_preferences/shared_preferences.dart';

基础操作实现

  • 初始化 SharedPreferences 实例:
    final prefs = await SharedPreferences.getInstance();
  • 数据写入示例:
    prefs.setInt('counter', 42); prefs.setString('username', 'FlutterUser');
  • 数据读取示例:
    int? counter = prefs.getInt('counter'); String? username = prefs.getString('username');
  • 删除数据与清空存储:
    prefs.remove('counter'); prefs.clear();

高级应用场景

  • 监听数据变化:通过StreamValueNotifier包装
  • 复杂对象存储:JSON 序列化与反序列化(结合dart:convert
  • 安全增强:敏感数据加密建议(如结合flutter_secure_storage

性能优化与最佳实践

  • 避免频繁调用getInstance()
  • 批量写入使用commit()替代set方法链
  • 异常处理与空安全适配

常见问题排查

  • 数据类型不匹配导致的读取失败
  • Web 平台兼容性注意事项
  • 调试技巧:查看原生平台存储文件位置

实战案例演示

  • 用户偏好设置(主题、语言切换)
  • 应用状态持久化(登录状态、历史记录)
  • 离线缓存策略设计

版本迁移与升级指南

  • 从旧版本迁移到 2.5.4 的改动点
  • 废弃 API 替代方案

参考资料与扩展阅读

  • 官方插件文档链接
  • 社区推荐的最佳实践文章
  • 相关开源项目案例

一、shared_preferences 2.5.4 核心特性与适配说明

1.1 版本核心更新

特性 / 优化点具体说明
API 稳定性提升修复 2.3.x 版本中SharedPreferencesAsync异步读写的偶发阻塞问题
多平台适配完善优化 Windows 端 AppData 目录读写权限,macOS 10.15 + 兼容性增强
缓存机制优化SharedPreferencesWithCache的缓存刷新逻辑更高效,减少多隔离区数据不一致
迁移工具完善提供更健壮的旧版 API 向新版异步 API 迁移工具,降低数据丢失风险

1.2 平台存储位置与支持类型

(1)各平台存储路径
平台SharedPreferences(旧版)SharedPreferencesAsync/WithCache(新版)
Android系统 SharedPreferences(xml 文件)DataStore Preferences(默认)/SharedPreferences
iOS/macOSNSUserDefaultsNSUserDefaults
LinuxXDG_DATA_HOME 目录下的键值文件XDG_DATA_HOME 目录下的键值文件
Web浏览器 LocalStorage浏览器 LocalStorage
Windows系统漫游 AppData 目录系统漫游 AppData 目录
(2)支持的数据类型

该版本仅支持以下基础数据类型,不支持自定义对象(需序列化后以 String 存储):intdoubleboolStringList<String>

二、核心 API 分类与使用场景

2.5.4 版本提供三类核心 API,适配不同的开发场景,开发者可根据性能、数据一致性需求选择:

API 类型核心特点适用场景性能数据一致性
SharedPreferences(旧版)带本地缓存,同步 get / 异步 set,未来将废弃简单场景、低频次读写、无需跨隔离区访问较低
SharedPreferencesAsync无缓存,全异步读写,直接访问原生存储多隔离区 / 多引擎实例、跨端数据同步场景
SharedPreferencesWithCache带可控缓存,同步 get / 异步 set,可配置白名单高频次读操作、需平衡性能与数据一致性场景

三、实操案例:不同 API 的使用方式

3.1 基础配置

首先在pubspec.yaml中引入依赖:

dependencies: flutter: sdk: flutter shared_preferences: 2.5.4 # 如需Android端指定SharedPreferences后端,需额外引入 # shared_preferences_android: ^2.2.0

3.2 旧版 SharedPreferences(兼容使用)

适合快速实现简单存储,注意该 API 未来将废弃,新工程建议使用新版:

import 'package:shared_preferences/shared_preferences.dart'; // 写入数据 Future<void> saveUserData() async { // 获取实例(异步) final SharedPreferences prefs = await SharedPreferences.getInstance(); // 写入不同类型数据 await prefs.setInt('user_age', 25); await prefs.setBool('is_login', true); await prefs.setString('user_name', 'FlutterDev'); await prefs.setStringList('hobbies', ['coding', 'reading', 'running']); } // 读取数据 Future<void> readUserData() async { final SharedPreferences prefs = await SharedPreferences.getInstance(); // 同步读取,无数据返回null final int? age = prefs.getInt('user_age'); final bool? isLogin = prefs.getBool('is_login'); final String? name = prefs.getString('user_name'); final List<String>? hobbies = prefs.getStringList('hobbies'); print('用户名:$name,年龄:$age,是否登录:$isLogin'); } // 删除数据 Future<void> removeData() async { final SharedPreferences prefs = await SharedPreferences.getInstance(); await prefs.remove('user_age'); // 删除指定键 // await prefs.clear(); // 清空所有数据 }

3.3 新版 SharedPreferencesAsync(推荐)

无缓存设计,保证数据一致性,适合多场景数据读写:

import 'package:shared_preferences/shared_preferences.dart'; // 初始化异步实例 final SharedPreferencesAsync asyncPrefs = SharedPreferencesAsync(); // 写入数据 Future<void> saveDataAsync() async { await asyncPrefs.setDouble('score', 98.5); await asyncPrefs.setString('token', 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...'); } // 读取数据 Future<void> readDataAsync() async { final double? score = await asyncPrefs.getDouble('score'); final String? token = await asyncPrefs.getString('token'); print('分数:$score,Token:$token'); } // 清空数据(指定白名单,仅删除白名单外数据) Future<void> clearDataAsync() async { await asyncPrefs.clear(allowList: {'token'}); // 保留token键 }

3.4 SharedPreferencesWithCache(高性能读写)

带缓存的新版 API,适合高频读场景,可配置白名单限制可操作的键:

import 'package:shared_preferences/shared_preferences.dart'; // 创建带缓存的实例,指定白名单 Future<void> initCachePrefs() async { final SharedPreferencesWithCache prefsWithCache = await SharedPreferencesWithCache.create( cacheOptions: const SharedPreferencesWithCacheOptions( allowList: {'theme_mode', 'font_size'}, // 仅允许操作这两个键 ), ); // 写入数据 await prefsWithCache.setInt('font_size', 16); await prefsWithCache.setBool('theme_mode', true); // 同步读取缓存数据 final int? fontSize = prefsWithCache.getInt('font_size'); print('字体大小:$fontSize'); // 清空数据(白名单已配置,无需重复传) await prefsWithCache.clear(); }

3.5 旧版迁移到新版 API

2.5.4 版本提供了便捷的迁移工具,确保旧版数据无缝迁移到新版异步 API:

import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/util/legacy_to_async_migration_util.dart'; Future<void> migrateData() async { // 获取旧版实例 final SharedPreferences legacyPrefs = await SharedPreferences.getInstance(); // 执行迁移(仅首次执行,通过migrationCompletedKey标记) await migrateLegacySharedPreferencesToSharedPreferencesAsyncIfNecessary( legacySharedPreferencesInstance: legacyPrefs, sharedPreferencesAsyncOptions: const SharedPreferencesOptions(), migrationCompletedKey: 'migration_completed_2025', // 自定义标记键 ); }

四、注意事项

  1. 数据安全性:该插件仅适用于非敏感数据存储(如用户偏好设置、简单配置),密码、token 等敏感数据需加密后再存储;
  2. 跨隔离区使用:若在多隔离区中使用带缓存的 API,需在读取前调用reload()刷新缓存,避免数据不一致;
  3. Android 后端选择:如需兼容原生 Android 的 SharedPreferences 数据,需通过SharedPreferencesAsyncAndroidOptions指定后端类型;
  4. 数据量限制:适合存储 KB 级别的小数据,大量数据建议使用 Hive、SQFlite 等数据库。

五、总结

shared_preferences 2.5.4 版本通过三类差异化 API,满足了 Flutter 开发者在不同场景下的本地轻量级存储需求。新版异步 API(SharedPreferencesAsync/WithCache)解决了旧版缓存导致的数据一致性问题,同时保持了易用性;旧版 API 则可作为过渡方案。开发者可根据项目的性能、一致性需求选择合适的 API,结合平台特性做好适配,高效实现本地数据持久化。

欢迎大家加入[开源鸿蒙跨平台开发者社区](https://openharmonycrossplatform.csdn.net),一起共建开源鸿蒙跨平台生态。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/15 7:30:43

Transformer Lab 完整指南:轻松实验大型语言模型的终极解决方案

Transformer Lab 完整指南&#xff1a;轻松实验大型语言模型的终极解决方案 【免费下载链接】transformerlab-app Experiment with Large Language Models 项目地址: https://gitcode.com/GitHub_Trending/tr/transformerlab-app Transformer Lab 是一款革命性的开源应用…

作者头像 李华
网站建设 2026/2/11 13:48:31

微服务监控选型新视角:从SkyWalking到Sentry的架构思维重构

微服务监控选型新视角&#xff1a;从SkyWalking到Sentry的架构思维重构 【免费下载链接】skywalking APM, Application Performance Monitoring System 项目地址: https://gitcode.com/gh_mirrors/sky/skywalking 在数字化转型的浪潮中&#xff0c;微服务架构已成为企业…

作者头像 李华
网站建设 2026/2/8 3:38:58

The Mirror版本控制系统:重新定义多人协作开发体验

The Mirror版本控制系统&#xff1a;重新定义多人协作开发体验 【免费下载链接】the-mirror 项目地址: https://gitcode.com/GitHub_Trending/th/the-mirror 还在为团队协作中的版本混乱而头疼吗&#xff1f;当多个开发者同时修改同一项目时&#xff0c;传统版本控制系…

作者头像 李华
网站建设 2026/2/12 15:49:31

魔曰加密工具:用古风伪装实现现代数据安全保护

在数字信息泛滥的时代&#xff0c;如何巧妙隐藏敏感内容成为关键挑战。传统加密工具生成的乱码字符极易引起注意&#xff0c;而魔曰加密工具将安全性与艺术性完美融合&#xff0c;让加密数据化身为优雅的古风文本&#xff0c;实现真正的隐形保护。 【免费下载链接】Abracadabra…

作者头像 李华
网站建设 2026/2/16 6:23:30

每日一个C++知识点|虚函数

C虚函数 作为C程序员&#xff0c;“多态”绝对是绕不开的核心知识点&#xff0c;而撑起多态的关键技术&#xff0c;正是今天要聊的虚函数。 一、先搞懂&#xff1a;虚函数到底是啥&#xff1f; 一句话概括&#xff1a;基类中加了virtual关键字的成员函数&#xff0c;就是虚函…

作者头像 李华