Flutter 本地存储
文章目录Flutter 本地存储SharedPreferences添加依赖获取实例写入读取删除清空SQLite添加依赖定义数据库定义数据模型DAO(数据访问对象)使用文件存储添加依赖常用目录文件操作目录操作Flutter 本地存储SharedPreferences类型键值对适应场景存放简单配置、用户偏好、Token本质SharedPreferences 本质是把键值对写到 Android 的SharedPreferences和 iOS 的NSUserDefaults添加依赖dependencies:shared_preferences:^2.2.3获取实例finalprefsawaitSharedPreferences.getInstance();写入prefs.setString(name,小明);prefs.setInt(age,18);prefs.setDouble(weight,70.5);prefs.setBool(sex,true);prefs.setStringList(address,[北京,上海,重庆]);读取finalStringnameprefs.getString(name)??;finalint ageprefs.getInt(age)??0;finaldouble weightprefs.getDouble(weight)??0;finalbool sexprefs.getBool(sex)??false;finalListStringaddressprefs.getStringList(address)??[];删除awaitprefs.remove(name);清空awaitprefs.clear();SQLite类型关系型数据库适应场景结构化业务数据、列表分页添加依赖dependencies:sqflite:^2.3.3path:^1.9.0path_provider:^2.1.4定义数据库classDBManager{staticfinalDBManagerinstanceDBManager();Database?_db;FutureDatabasegetdbasync{_db??awaitopen();return_db!;}FutureDatabaseopen()async{finalStringdirawaitgetDatabasesPath();finalStringdbPathpath.join(dir,app.db);returnopenDatabase(dbPath,version:1,onCreate:_create);}void_create(Databasedb,int version)async{finalbatchdb.batch();finalStringsql CREATE TABLE note( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, content TEXT, category TEXT DEFAULT DEFAULT, pinned INTEGER NOT NULL DEFAULT 0, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL ); ;batch.execute(sql);batch.execute(CREATE INDEX idx_note_category ON note(category););batch.execute(CREATE INDEX idx_note_updated_at ON note(updated_at DESC););// execute将操作添加到队列中// commit执行有操作awaitbatch.commit(noResult:true);}voidclose()async{await_db?.close();_dbnull;}}定义数据模型classNote{finalint?id;finalStringtitle;finalString?content;finalStringcategory;finalint pinned;latefinalDateTimecreatedAt;latefinalDateTimeupdatedAt;Note({this.id,requiredthis.title,this.content,this.categorydefault,this.pinned0,DateTime?createdAt,DateTime?updatedAt,}){this.createdAtcreatedAt??DateTime.now();this.updatedAtupdatedAt??DateTime.now();}MapString,Object?toMap(){return{id:id,title:title,content:content,category:category,pinned:pinned,created_at:createdAt.millisecondsSinceEpoch,updated_at:updatedAt.millisecondsSinceEpoch,};}factoryNote.fromMap(MapString,Object?map){returnNote(id:map[id]asint?,title:map[title]asString,content:map[content]asString?,category:map[category]asString,pinned:map[pinned]asint,createdAt:DateTime.fromMicrosecondsSinceEpoch(map[created_at]asint),updatedAt:DateTime.fromMicrosecondsSinceEpoch(map[updated_at]asint),);}overrideStringtoString(){returnNote{id:$id, title:$title, content:$content, category:$category, pinned:$pinned, createdAt:$createdAt, updatedAt:$updatedAt};}}DAO(数据访问对象)classNoteDao{staticfinalNoteDaoinstanceNoteDao();FutureDatabaseget_dbDBManager.instance.db;// 增FutureNoteinsert(Notenode)async{finalidawait(await_db).insert(note,node.toMap()..remove(id),conflictAlgorithm:ConflictAlgorithm.replace,);returnNote(id:id,title:node.title,content:node.content,category:node.category,pinned:node.pinned,createdAt:node.createdAt,updatedAt:node.updatedAt,);}// 删Futureintdelete(int id)async{return(await_db).delete(note,where:id?,whereArgs:[id]);}// 改Futureintupdate(int id,Stringcontent)async{return(await_db).update(note,{content:content,updated_at:DateTime.now().millisecond},where:id?,whereArgs:[id],);}// 查FutureNote?get(int id)async{finalrowsawait(await_db).query(note,where:id?,whereArgs:[id],limit:1,);returnrows.isEmpty?null:Note.fromMap(rows.first);}// 查询多条FutureListNotegetList(int page,int pageSize,{String?category,String?keyword,})async{finalListStringwhere[];finalListObject?args[];if(category!nullcategory.isNotEmpty){where.add(category?);args.add(category);}if(keyword!nullkeyword.isNotEmpty){where.add((title LIKE ? OR content LIKE ?));args.add(%${keyword}%);args.add(%${keyword}%);}finalrowsawait(await_db).query(note,where:where.isEmpty?null:where.join( AND ),whereArgs:args.isEmpty?null:args,orderBy:pinned DESC, updated_at DESC,limit:pageSize,offset:page*pageSize,);varnoteListrows.map(Note.fromMap).toList(growable:false);returnnoteList;}}使用增vardaoNoteDao();dao.insert(Note(title:日记1,content:这是日记1的内容));vardaoNoteDao();dao.insert(Note(title:日记2,content:这是日记2的内容,category:日记2的分类,pinned:1,),);删vardaoNoteDao();dao.delete(1);改vardaoNoteDao();dao.update(3,hello world);查vardaoNoteDao();varnoteawaitdao.get(3);print(note:${note});ar daoNoteDao();varlistawaitdao.getList(0,30,keyword:hello world);print(noteList:${list});文件存储path_provider是一个 Flutter 插件本身不提供文件操作功能负责获取跨平台的目录路径。因为不同操作系统、不同设备的目录结构不同手动硬编码路径会导致兼容性问题。path_provider提供了跨平台的统一 API。添加依赖dependencies:path_provider:^2.1.5常用目录// 应用文档目录存储用户数据不会被系统自动清理finalDirectorydocDirawaitgetApplicationDocumentsDirectory();// Android: /data/data/包名/app_flutter// iOS: /var/mobile/Containers/Data/Application/UUID/Documents// 应用支持目录存储持久化数据finalDirectorysupportDirawaitgetApplicationSupportDirectory();// Android: /data/data/包名/files即 context.getFilesDir()// iOS: /var/mobile/Containers/Data/Application/UUID/Library/Application Support// 应用缓存目录在空间不足是会自动清理finalDirectorycacheDirawaitgetApplicationCacheDirectory();// Android: /data/data/包名/cache// iOS: /var/mobile/Containers/Data/Application/UUID/Library/Caches// 临时目录每次应用重启可能被清理finalDirectorytmpDirawaitgetTemporaryDirectory();// Android: /data/data/包名/cache// iOS: /var/mobile/Containers/Data/Application/UUID/tmp// 下载目录finalDirectory?downloadDirawaitgetDownloadsDirectory();// Android: /storage/emulated/0/Download// macOS: ~/Downloads// 外部存储目录Android专用需要申请权限finalDirectory?externalDirawaitgetExternalStorageDirectory();// Android: /storage/emulated/0/Android/data/包名/files文件操作File文件操作Directory目录操作FileSystemEntity文件系统实体基类Platform获取操作系统信息finaldirawaitgetApplicationDocumentsDirectory();finalfileFile(${dir.path}/myfile.txt);// 写入文本awaitfile.writeAsString(hello);// 写入awaitfile.writeAsString(world,mode:FileMode.append);// 追加写入// 读取文本finalcontentawaitfile.readAsString();// 流式写入finalsinkfile.openWrite(mode:FileMode.append);sink.write(hello\n);sink.write(world\n);awaitsink.flush();awaitsink.close();// 文件信息finalstatawaitfile.stat();// 获取文件元数据print(文件大小(字节)${stat.size});print(文件修改时间${stat.modified});print(文件类型${stat.type});// 文件是否存在awaitfile.exists();// 文件移动/重命名finalnewDirDirectory(${dir.path}/abc);if(!awaitnewDir.exists()){awaitnewDir.create();}finalnewPath${newDir.path}/efg.txt;file.rename(newPath);// 文件复制file.copy(newPath);// 文件删除awaitfile.delete();目录操作// 创建目录finalparentDirawaitgetApplicationDocumentsDirectory();finalDirectorydirDirectory(${parentDir.path}/mydir);awaitdir.create();// 递归创建目录awaitdir.create(recursive:true);// 递归创建目录awaitdir.delete(recursive:true);// 支持递归删除// 展示目录内容finaldirawaitgetApplicationDocumentsDirectory();finalfilesawaitdir.list().toList();for(finalentityinfiles){print(entity:${entity});}// 深度遍历展示目录内finalfilesawaitdir.list(recursive:true).toList();for(finalentityinfiles){print(entity:${entity});}

相关新闻

Hermes Agent 架构解析——底层如何工作

Hermes Agent 架构解析——底层如何工作

23. Hermes Agent 架构解析——底层如何工作 要看懂一个 Agent 框架,先看它的骨架。本篇带你从入口点到子系统,理清 Hermes Agent 的内部结构和数据流,在代码库中快速定位自己。 系统全景:多个入口,一个核心 Hermes…

2026/9/24 16:38:54 阅读更多 →
河南省第一届职业技能大赛网络安全项目A模块公开新题

河南省第一届职业技能大赛网络安全项目A模块公开新题

A-8数据库加固任务环境说明:(Linux)系统:用户名root,密码123456删除默认数据库(test);改变默认MySql管理员用户为:SuperRoot;使用MySql内置MD5加密函数加密用户user1的密码为(Pssw0rd1!);赋予user1用户对数据库所有表只有select、…

2026/9/23 18:14:23 阅读更多 →
前面漏洞出现的php函数

前面漏洞出现的php函数

call_user_func() 调用一个普通回调函数 call_user_func($_GET[func], $_GET[arg]); call_user_func_array() 带参数数组调用回调函数 和上面一樣,参数以数组传递 array_map() 对数组每个元素应用回调函数 array_map($_GET[func], $_GET[data]); pathin…

2026/9/23 3:36:24 阅读更多 →

最新新闻

rsuite Calendar 自定义单元格样式:深入解析 cellClassName 的用法与实现原理

rsuite Calendar 自定义单元格样式:深入解析 cellClassName 的用法与实现原理

前端UI组件 【免费下载链接】rsuite 🧱 A suite of React components . 项目地址: https://gitcode.com/gh_mirrors/rs/rsuite 点击查看 免费下载 导读 本文围绕 rsuite 的 Calendar(日历)组件,重点讲解如何通过 ce…

2026/9/25 22:56:19 阅读更多 →
802.11ax调度机制全解析:OFDMA、MU-MIMO与TWT实战调优

802.11ax调度机制全解析:OFDMA、MU-MIMO与TWT实战调优

如果你最近在无线网络圈子里逛,应该会频繁看到“ax调度”这个词。“ax”就是 802.11ax,也就是 Wi-Fi 6 的技术代号,而“调度”才是 802.11ax 真正值钱的地方。很多人以为 Wi-Fi 6 只是“快了一点”,换了张网卡、开了 160MHz 频宽就…

2026/9/25 22:56:19 阅读更多 →
Windows下H.264解码库集成指南:从选型到踩坑

Windows下H.264解码库集成指南:从选型到踩坑

简介:这是一份面向Windows平台的H.264视频解码库资源,由开发者rapidly552整理分享,适合需要在应用程序中快速集成H.264解码能力的C/C工程师及视频技术学习者。该库严格基于AVC标准,实现了运动补偿、帧内预测、多参考帧、熵编码等核…

2026/9/25 22:56:19 阅读更多 →
C#控制台贪吃蛇实战:从数据结构到游戏循环的完整指南

C#控制台贪吃蛇实战:从数据结构到游戏循环的完整指南

简介:面向C#初学者的控制台贪吃蛇实战项目,以经典小游戏为载体,串联类、方法、变量、条件语句等核心语法,并完整覆盖控制台输入输出、按键捕获、主循环、碰撞检测、蛇身增长、随机食物生成、状态更新与字符画面重绘等关键开发环节…

2026/9/25 22:56:19 阅读更多 →
图书管理系统数据库设计与实现:E-R建模到SQLAlchemy落地

图书管理系统数据库设计与实现:E-R建模到SQLAlchemy落地

简介:本资源是一份面向高校数据库课程学习者与Python初学者的完整课程设计实践方案,聚焦图书管理系统的开发全流程,涵盖需求分析、数据库建模、后端逻辑实现与基础部署。压缩包共9个文件,含4个SQL脚本(books、admin、s…

2026/9/25 22:56:19 阅读更多 →
ZoneDeck进程冻结与效率模式指南:挂起进程省CPU降内存,后台视频游戏秒停

ZoneDeck进程冻结与效率模式指南:挂起进程省CPU降内存,后台视频游戏秒停

ZoneDeck进程冻结与效率模式指南:挂起进程省CPU降内存,后台视频游戏秒停 【免费下载链接】ZoneDeck The Ultimate Workspace Manager, Switch between work and life, seamlessly生活工作无缝切换,专业的桌面工作区管理助手 项目地址: http…

2026/9/25 22:54:18 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/25 19:27:14 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/25 20:29:09 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/25 20:29:43 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/25 20:29:31 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/25 19:27:26 阅读更多 →