Flutter 本地存储完整教程
Flutter 四大存储核心对比 SP / 文件 / Hive / SQLite-Drift对比与使用一、四种存储方案总览对比存储方案底层实现存储数据类型性能支持对象加密适用场景SharedPreferences安卓 SP /iOS NSUserDefaults基础类型String/int/bool/List一般❌ 需要 Json 序列化❌登录状态、token、开关、简单配置本地文件存储系统文件 IO任意文本、二进制、图片中等✅ 手动 json 解析❌ 需自行加密日志、缓存图片、导出文本Hive纯 Dart 自研 NoSQL基础类型 自定义实体类极高✅ 原生支持对象✅ AES 加密用户信息、购物车、接口缓存项目主流Drift(SQLite)原生 SQLite结构化数据表、关联数据高✅ 表模型映射✅ 支持数据库加密海量离线数据、多表关联、复杂分页查询二、SharedPreferences2.1 引入依赖dependencies:flutter:sdk:fluttershared_preferences:^2.2.32.2 支持存储数据类型仅支持String / int / double / bool / ListString不支持自定义对象、Map、数组对象需手动转 JSON 字符串存储2.3 基础 CRUD 使用importpackage:shared_preferences/shared_preferences;// 写入数据FuturevoidsetSP()async{finalspawaitSharedPreferences.getInstance();awaitsp.setString(token,abc123xyz);awaitsp.setInt(userId,10086);awaitsp.setBool(isLogin,true);awaitsp.setDouble(score,98.5);awaitsp.setStringList(tags,[前端,Flutter]);}// 读取数据FuturevoidgetSP()async{finalspawaitSharedPreferences.getInstance();Stringtokensp.getString(token)??;int uidsp.getInt(userId)??0;bool loginsp.getBool(isLogin)??false;ListStringtagssp.getStringList(tags)??[];}// 删除单个keyawaitsp.remove(token);// 清空全部存储awaitsp.clear();2.4 封装全局工具类sp_util.dartimportdart:convert;importpackage:shared_preferences/shared_preferences;classSPUtil{staticFutureSharedPreferencesgetInstance()async{returnawaitSharedPreferences.getInstance();}// 存基础类型staticFuturevoidset(Stringkey,dynamicvalue)async{finalspawaitgetInstance();if(valueisString){awaitsp.setString(key,value);}elseif(valueisint){awaitsp.setInt(key,value);}elseif(valueisdouble){awaitsp.setDouble(key,value);}elseif(valueisbool){awaitsp.setBool(key,value);}elseif(valueisListString){awaitsp.setStringList(key,value);}else{// 对象转json存储awaitsp.setString(key,jsonEncode(value));}}// 读取字符串/对象staticFutureT?getT(Stringkey)async{finalspawaitgetInstance();dynamicvalsp.get(key);if(TStringval!null){try{returnjsonDecode(val)asT;}catch(_){returnvalasT;}}returnval;}// 删除keystaticFuturevoidremove(Stringkey)async{finalspawaitgetInstance();awaitsp.remove(key);}// 清空所有staticFuturevoidclearAll()async{finalspawaitgetInstance();awaitsp.clear();}}使用示例// 存储登录状态awaitSPUtil.set(isLogin,true);// 读取bool loginawaitSPUtil.get(isLogin)??false;// 存储对象MapawaitSPUtil.set(user,{id:1,name:小明});MapuserawaitSPUtil.get(user);2.5 缺点总结仅支持基础类型对象必须 JSON 序列化大量数据读写性能差跨平台底层实现不一致部分机型存在延迟无加密、无索引不适合缓存列表数据。三、本地文件存储dart:io path_provider3.1. 依赖dependencies:flutter:sdk:flutterpath_provider:^2.1.2path:^1.8.33.2. 常用文件目录临时目录getTemporaryDirectory() 缓存文件系统可自动清理持久目录getApplicationDocumentsDirectory() 永久存储卸载才删除缓存目录getApplicationCacheDirectory()3.3. 读写文本 / JSON 文件importdart:io;importdart:convert;importpackage/path_provider/path_provider.dart;importpackage/path/path.dart;// 获取文件路径FutureStringgetFilePath()async{DirectorydirawaitgetApplicationDocumentsDirectory();returnjoin(dir.path,user_info.json);}// 写入json文件FuturevoidwriteFile()async{StringpathawaitgetFilePath();FilefileFile(path);Mapdata{id:1,name:李四};awaitfile.writeAsString(jsonEncode(data));}// 读取文件FutureMap?readFile()async{StringpathawaitgetFilePath();FilefileFile(path);if(!awaitfile.exists())returnnull;Stringcontentawaitfile.readAsString();returnjsonDecode(content);}// 删除文件FuturevoiddeleteFile()async{StringpathawaitgetFilePath();FilefileFile(path);if(awaitfile.exists())awaitfile.delete();}3.4. 二进制文件图片 / 文件缓存// 写入字节awaitfile.writeAsBytes([0xff,0xff]);// 读取字节Listintbytesawaitfile.readAsBytes();3.5. 优缺点✅ 优点自由控制文件适合图片、日志、导出文档❌ 缺点无键值索引查询麻烦需要手动解析 JSON无内置加密大批量数据效率极低四、Hive 高性能 NoSQL4.1. 完整依赖dependencies:flutter:sdk:flutterhive:^2.2.3hive_flutter:^1.1.0dev_dependencies:hive_generator:^1.1.5build_runner:^2.4.64.2. 全局初始化 main.dartimportpackage:flutter/material.dart;importpackage:hive_flutter/hive_flutter.dart;voidmain()async{WidgetsFlutterBinding.ensureInitialized();awaitHive.initFlutter();// 有自定义模型需要在这里注册适配器// Hive.register(UserAdapter());runApp(constMyApp());}4.3. 基础键值 CRUD无需模型// 打开盒子数据表finalboxawaitHive.openBox(user_box);// 写入awaitbox.put(token,token_123);awaitbox.putAll({id:1,name:王五});// 读取Stringtokenbox.get(token,defaultValue:);// 修改awaitbox.put(token,new_token);// 删除单个keyawaitbox.delete(token);// 清空整张表awaitbox.clear();4.4. 存储自定义实体类存储4.4.1. 创建模型 user_model.dartimportpackage:hive/hive.dart;partuser.g.dart;HiveType(typeId:0)classUserextendsHiveObject{HiveField(0)int id;HiveField(1)Stringname;HiveField(2)bool vip;User({requiredthis.id,requiredthis.name,requiredthis.vip});}4.4.2. 生成适配器命令flutter pub run build_runner build4.4.3. main 中注册模型// main中注册awaitHive.initFlutter();Hive.registerAdapter(UserAdapter());4.4.4 对象 CRUD 操作// 初始化注册适配器// Hive.registerAdapter(UserAdapter());varboxawaitHive.openBoxUser(user_table);// 新增awaitbox.add(User(id:1,name:张三,vip:false));// 根据key存储awaitbox.put(1,User(id:1,name:张三,vip:true));// 查询全部ListUserlistbox.values.toList();// 单个查询User?ubox.get(1);// 修改HiveObject自带saveu?.name新名字;awaitu?.save();// 删除awaitbox.delete(1);4.5. 加密存储密码 / 敏感数据ListintkeyHive.generateSecureKey();varsecureBoxawaitHive.openBox(secure,encryptionCipher:HiveAesCipher(key));awaitsecureBox.put(pwd,123456);4.6 全局工具类 hive_util.dartimportpackage:hive/hive;importpackage:hive_flutter/hive_flutter;classHiveUtil{// 打开盒子统一封装staticFutureBoxopenBox(StringboxName)async{returnawaitHive.openBox(boxName);}// 写入键值staticFuturevoidput(StringboxName,Stringkey,dynamicvalue)async{varboxawaitopenBox(boxName);awaitbox.put(key,value);}// 读取staticdynamicget(StringboxName,Stringkey,{dynamicdefaultValue})async{varboxawaitopenBox(boxName);returnbox.get(key,defaultValue:defaultValue);}// 删除keystaticFuturevoidremove(StringboxName,Stringkey)async{varboxawaitopenBox(boxName);awaitbox.delete(key);}// 清空盒子staticFuturevoidclear(StringboxName)async{varboxawaitopenBox(boxName);awaitbox.clear();}// 关闭所有hivestaticFuturevoidcloseAll()async{awaitHive.close();}}使用示例// 存储登录状态awaitHiveUtil.put(user_box,isLogin,true);bool loginawaitHiveUtil.get(user_box,isLogin,defaultValue:false);4.6. 优缺点纯 Dart 实现无原生交互双端表现一致支持直接存储对象无需 JSON 手动序列化读写速度远超 SP适合列表缓存内置 AES 加密可存储敏感信息支持懒加载占用内存低支持增删改查、条件过滤、排序。❌ 缺点不支持复杂联表查询海量结构化数据不如 SQLite五、Drift SQLite 关系型数据库5.1. 依赖dependencies:flutter:sdk:flutterdrift:^2.19.0sqlite3_flutter_libs:^0.5.0dev_dependencies:drift_dev:^2.19.0build_runner:^2.4.05.2. 核心特点底层 SQLite支持标准 SQL、事务、分页、联表、索引自动生成 Dart 模型类型安全支持数据库加密、版本迁移适合百万级离线结构化数据聊天、本地订单5.3. 简易表定义示例importpackage:drift/drift;partdb.g.dart;classUserTableextendsTable{IntColumngetidinteger().autoIncrement()();TextColumngetnametext()();BoolColumngetvipboolean().withDefault(constConstant(false))();}DriftDatabase(tables:[UserTable])classAppDbextends_$AppDb{AppDb():super(openConnection());overrideintgetschemaVersion1;}5.4. 基础增删改查finaldbAppDb();// 插入awaitdb.into(userTable).insert(UserTableCompanion(name:constValue(张三)));// 查询所有ListUserTableDatalistawaitdb.select(userTable).get();// 条件查询varsingleawait(select(userTable)..where((t)t.id.equals(1))).getSingleOrNull();// 更新awaitupdate(userTable).replace(UserTableData(id:1,name:李四,vip:false));// 删除awaitdelete(userTable).deleteWhere((t)t.id.equals(1));5.5. 优缺点✅ 优点标准 SQL、支持复杂联表、分页、事务、海量数据稳定❌ 缺点学习成本高需要维护表结构与版本迁移简单配置场景过度设计总结所有存储操作均为异步必须 await密码等敏感数据禁止明文优先 Hive 加密不要在 build 同步读写存储阻塞 UI超大二进制不要存在数据库存本地文件只存路径。

相关新闻

如何用Zotero Style插件提升文献管理效率:从混乱到有序的终极指南

如何用Zotero Style插件提升文献管理效率:从混乱到有序的终极指南

如何用Zotero Style插件提升文献管理效率:从混乱到有序的终极指南 【免费下载链接】zotero-style Ethereal Style for Zotero 项目地址: https://gitcode.com/GitHub_Trending/zo/zotero-style 你是否曾为Zotero文献管理软件的单调界面感到厌倦?是…

2026/10/2 7:39:10 阅读更多 →
Bell首架用于亚太地区空中巡逻任务的505型直升机正式投入运营

Bell首架用于亚太地区空中巡逻任务的505型直升机正式投入运营

Textron Inc.(NYSE::TXT)旗下子公司Bell Textron Inc.宣布,爱知县警察局已正式启用Bell 505直升机开展空中警务行动,这是亚太地区航空界的重要里程碑。在日本名古屋的小牧机场举行了一场庆祝仪式,以纪念这一…

2026/10/4 3:00:59 阅读更多 →
Linux RPM包管理:解决Google Chrome安装NOKEY错误与GPG密钥安全导入

Linux RPM包管理:解决Google Chrome安装NOKEY错误与GPG密钥安全导入

1. 项目概述:一个看似简单的报错,背后是Linux包管理的信任基石如果你在Linux系统上,特别是像Fedora、CentOS、RHEL或者openSUSE这类使用RPM包管理器的发行版上,尝试安装或更新Google Chrome时,大概率会遇到这个拦路虎&…

2026/10/9 7:07:50 阅读更多 →

最新新闻

从0到1:基于OneCode与Trae的服务管理系统开发实战——注解驱动与TaoToken统一Key接入

从0到1:基于OneCode与Trae的服务管理系统开发实战——注解驱动与TaoToken统一Key接入

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 7:36:23 阅读更多 →
SpringBoot全家桶实战:校园综合服务平台完整落地

SpringBoot全家桶实战:校园综合服务平台完整落地

1. 一个校园综合服务平台,为什么最终选了SpringBoot全家桶接手这个"校园综合服务平台"项目的时候,需求其实不算复杂:学生要能在上面查课表、看成绩、充值校园卡、在线报修,老师要能发布通知、管理活动,后勤那…

2026/10/12 7:36:23 阅读更多 →
重置 iPhone 会删除所有内容吗?备份与恢复完整指南

重置 iPhone 会删除所有内容吗?备份与恢复完整指南

把旧手机抹掉之前,很多人都会在“设置—通用—传输或还原 iPhone”那个界面犹豫半天,然后跑到网上搜“重置 iPhone 会删除所有内容吗”。答案是:如果你选的是“抹掉所有内容和设置”,那手机本机上的照片、聊天记录、App、通讯录都…

2026/10/12 7:36:23 阅读更多 →
扩展 xfce4-find-cursor 功能:把光标定位接入 TaoToken 统一 Key 通道

扩展 xfce4-find-cursor 功能:把光标定位接入 TaoToken 统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 7:36:23 阅读更多 →
WSL2 GPU直通实战:Windows上高效部署AI开发环境

WSL2 GPU直通实战:Windows上高效部署AI开发环境

1. 为什么现在必须认真对待 WSL2 的 AI 开发环境部署最近在几个技术交流群里,几乎每天都有人问:“本地跑 Llama 3-8B 量化模型卡在 0.3 tokens/s,是不是显卡没喂饱?”“PyTorch 编译 CUDA 扩展失败,报错找不到 nvcc&am…

2026/10/12 7:36:23 阅读更多 →
libnodave实战:在C#和LABVIEW中调用S7通讯库

libnodave实战:在C#和LABVIEW中调用S7通讯库

简介:libnodave-0.8.5.zip 是一套面向工业自动化开发者的西门子 S7 系列 PLC 通信库,适合在 LABVIEW、C# 等环境中集成调用,解决跨平台与 PLC 进行数据交互的问题。压缩包共 120 个文件,约 1.71MB,包含 28 个 C 源码、…

2026/10/12 7:35:23 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →