HarmonyOS7 AppStorage 和 PersistentStorage 到底该选谁?全局状态别再用乱
文章目录前言AppStorage内存级的全局仓库PersistentStorage能活过重启的存储两者配合的最佳实践实战登录态 主题色 语言的全局管理几个实用建议最后聊两句前言做鸿蒙开发绕不开一个问题用户登录了首页要显示昵称我的页面要显示头像设置页要展示会员等级。多个页面共享同一份数据怎么搞State和Prop搞不定跨组件通信这时候就该AppStorage出场了。但如果用户杀了应用再打开你还想保留这些数据呢那得加上PersistentStorage。今天把这两个东西掰清楚了讲再给个实际项目中的搭配方案。AppStorage内存级的全局仓库AppStorage是个单例的键值对存储整个应用生命周期内有效。你往里塞个值任何组件都能读出来。核心 API 很简单// 写入AppStorage.setOrCreatestring(userName,张三)AppStorage.setOrCreatenumber(userId,10086)// 读取letnameAppStorage.getstring(userName)// 张三// 删除AppStorage.delete(userName)// 检查是否存在AppStorage.has(userName)// false在组件里用起来更顺手用StorageProp和StorageLinkComponentstruct UserProfile{// 只读——AppStorage 变了UI 会刷新但改这个变量不会写回StorageProp(userName)userName:string// 双向——改了这个变量AppStorage 里的值也变StorageLink(themeColor)themeColor:string#3498dbbuild(){Column(){Text(欢迎回来${this.userName}).fontSize(18)Button(切换主题色).onClick((){this.themeColorthis.themeColor#3498db?#e74c3c:#3498db}).backgroundColor(this.themeColor)}}}StorageProp是单向的组件读 AppStorage 的值但改本地变量不会影响全局。StorageLink是双向的改一头另一头跟着动。AppStorage 的局限它是纯内存的。应用被系统杀掉、用户手动退出数据就没了。下次打开又是白纸一张。PersistentStorage能活过重启的存储PersistentStorage解决的就是持久化问题。它把数据写到磁盘上应用重启后自动恢复。用法也不复杂// 在应用启动时调用通常在 UIAbility 的 onCreate 里PersistentStorage.persistPropstring(userName,)PersistentStorage.persistPropstring(themeColor,#3498db)PersistentStorage.persistPropstring(language,zh-CN)persistProp的意思是如果磁盘上有这个 key 的值就恢复到 AppStorage 里如果没有就用给的默认值。之后在组件里照常用StorageProp或StorageLink读写完全不用关心底层是内存还是磁盘。PersistentStorage自动在后台同步。两者配合的最佳实践实际项目中不是所有数据都需要持久化。我一般这么分数据类型存储方式例子需要持久化的设置PersistentStorageStorageLink主题色、语言、字体大小临时全局状态AppStorageStorageLink登录态、当前页面索引敏感信息不存这里Token 走安全存储关键原则PersistentStorage 负责恢复现场AppStorage 负责运行时共享。实战登录态 主题色 语言的全局管理先看应用入口在UIAbility里初始化持久化存储// entry/src/main/ets/entryability/EntryAbility.etsimportUIAbilityfromohos.app.ability.UIAbilityexportdefaultclassEntryAbilityextendsUIAbility{onCreate(want:Want,launchParam:AbilityConstant.LaunchParam):void{// 持久化这些需要跨重启保留的设置PersistentStorage.persistPropstring(themeColor,#3498db)PersistentStorage.persistPropstring(language,zh-CN)PersistentStorage.persistPropnumber(fontSize,16)PersistentStorage.persistPropboolean(isDarkMode,false)// 登录态不需要持久化安全考虑AppStorage.setOrCreateboolean(isLoggedIn,false)AppStorage.setOrCreatestring(userName,)}}注意Token、密码这类敏感信息不要往 PersistentStorage 里塞。它底层用的是 Preferences数据是明文存储的。敏感信息应该走ohos.security.keystore或业务侧加密后存储。然后搞一个设置页面Componentstruct SettingsPage{StorageLink(themeColor)themeColor:string#3498dbStorageLink(language)language:stringzh-CNStorageLink(fontSize)fontSize:number16StorageLink(isDarkMode)isDarkMode:booleanfalseStorageLink(isLoggedIn)isLoggedIn:booleanfalseStorageLink(userName)userName:stringbuild(){Column({space:20}){Text(设置).fontSize(22).fontWeight(FontWeight.Bold)// 主题色选择Row(){Text(主题色).fontSize(this.fontSize)Blank()Row({space:12}){Circle({width:30,height:30}).fill(#3498db).onClick((){this.themeColor#3498db})Circle({width:30,height:30}).fill(#e74c3c).onClick((){this.themeColor#e74c3c})Circle({width:30,height:30}).fill(#2ecc71).onClick((){this.themeColor#2ecc71})}}.width(100%).padding(12)// 语言选择Row(){Text(语言).fontSize(this.fontSize)Blank()Text(this.languagezh-CN?中文:English).fontSize(this.fontSize).onClick((){this.languagethis.languagezh-CN?en-US:zh-CN})}.width(100%).padding(12)// 字体大小Row(){Text(字体大小).fontSize(this.fontSize)Blank()Slider({value:this.fontSize,min:12,max:24,step:1}).width(150).onChange((value:number){this.fontSizevalue})Text(${this.fontSize}).width(30)}.width(100%).padding(12)// 暗色模式Row(){Text(暗色模式).fontSize(this.fontSize)Blank()Toggle({type:ToggleType.Switch,isOn:this.isDarkMode}).onChange((isOn:boolean){this.isDarkModeisOn})}.width(100%).padding(12)// 模拟登录/登出Button(this.isLoggedIn?退出登录:登录).backgroundColor(this.isLoggedIn?#999:this.themeColor).onClick((){if(this.isLoggedIn){this.isLoggedInfalsethis.userName}else{this.isLoggedIntruethis.userName张三}})}.padding(20)}}首页读取这些设置Componentstruct HomePage{StorageProp(userName)userName:stringStorageProp(isLoggedIn)isLoggedIn:booleanfalseStorageProp(themeColor)themeColor:string#3498dbStorageProp(fontSize)fontSize:number16build(){Column(){Text(this.isLoggedIn?Hi,${this.userName}:请先登录).fontSize(this.fontSize4).fontColor(this.themeColor)Text(这里是首页内容区域).fontSize(this.fontSize).margin({top:20})}.width(100%).padding(20)}}用户在设置页改了主题色首页的标题颜色立刻跟着变。杀应用重启主题色还是上次选的那个但登录状态没了——因为登录态走的是AppStorage不持久化。几个实用建议不要在 PersistentStorage 里存大对象。它底层用的 Preferences 有大小限制存个字符串、数字、布尔值没问题塞个几百 KB 的 JSON 就不合适了。大数据走关系型数据库或文件。初始化的时机要早。PersistentStorage.persistProp要在任何组件读取之前调用最靠谱的地方就是UIAbility.onCreate。放在页面组件的aboutToAppear里可能会来不及。命名要规范。key 都是全局的不同模块之间容易撞名。我建议加前缀比如settings.themeColor、user.name。最后聊两句AppStorage和PersistentStorage这对搭档用起来其实挺简单的。核心就是分清楚哪些数据要持久化、哪些不用。真正让人纠结的是什么时候该用全局状态。我的原则是能不用就不用。如果数据只在一个组件树里流转老老实实用StatePropLink往下传。全局状态是个诱惑用多了会让代码变得难追踪。等数据真正需要跨页面、跨模块共享了再把AppStorage请出来。

相关新闻

【IDEA数据库管理终极指南】:20年资深架构师亲授12个被90%开发者忽略的高效技巧

【IDEA数据库管理终极指南】:20年资深架构师亲授12个被90%开发者忽略的高效技巧

更多请点击: https://codechina.net 第一章:IDEA数据库管理的核心价值与认知重构 IntelliJ IDEA 不仅是 Java 开发者的首选 IDE,其内建的 Database Tools 早已超越传统“查看数据”的辅助定位,演进为贯穿开发全生命周期的数据协同…

2026/6/27 11:15:11阅读更多 →
限时开放|IDEA新手诊断工具包(含自动检测脚本+配置健康度评分系统):仅限前500名下载,3天后下线

限时开放|IDEA新手诊断工具包(含自动检测脚本+配置健康度评分系统):仅限前500名下载,3天后下线

更多请点击: https://codechina.net 第一章:IDEA新手诊断工具包概览 IntelliJ IDEA 不仅是一款功能强大的 Java 集成开发环境,更内置了一套面向初学者的诊断辅助体系——“新手诊断工具包”。它并非独立插件,而是由 IDE 内核自动…

2026/6/27 11:15:11阅读更多 →
IntelliJ IDEA快捷键失效、代码提示消失、索引崩溃?——IDE底层索引机制深度解析(附3分钟自愈脚本)

IntelliJ IDEA快捷键失效、代码提示消失、索引崩溃?——IDE底层索引机制深度解析(附3分钟自愈脚本)

更多请点击: https://codechina.net 第一章:IntelliJ IDEA快捷键失效、代码提示消失、索引崩溃?——IDE底层索引机制深度解析(附3分钟自愈脚本) IntelliJ IDEA 的“卡顿”“无提示”“CtrlClick 失效”等表象&#xf…

2026/6/27 11:15:11阅读更多 →
插件太多拖慢IDEA?2024最新性能基准测试曝光:这7个“伪刚需插件”必须卸载,否则白费32GB内存

插件太多拖慢IDEA?2024最新性能基准测试曝光:这7个“伪刚需插件”必须卸载,否则白费32GB内存

更多请点击: https://intelliparadigm.com 第一章:IDEA性能瓶颈的底层根源剖析 IntelliJ IDEA 作为一款功能强大的 JVM-based IDE,其性能表现高度依赖于 JVM 运行时环境、索引机制与插件生态的协同效率。当出现卡顿、高 CPU 占用或内存持续增…

2026/6/27 12:50:26阅读更多 →
AssetRipper终极指南:从Unity游戏中免费提取资源的完整解决方案

AssetRipper终极指南:从Unity游戏中免费提取资源的完整解决方案

AssetRipper终极指南:从Unity游戏中免费提取资源的完整解决方案 【免费下载链接】AssetRipper GUI application to analyze game files 项目地址: https://gitcode.com/GitHub_Trending/as/AssetRipper 你是否曾经想要提取Unity游戏中的角色模型、精美贴图或…

2026/6/27 12:50:26阅读更多 →
如何3步让旧Mac焕然一新:OpenCore Legacy Patcher实战指南

如何3步让旧Mac焕然一新:OpenCore Legacy Patcher实战指南

如何3步让旧Mac焕然一新:OpenCore Legacy Patcher实战指南 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 你是否有一台被苹果官方"抛弃&quo…

2026/6/27 12:50:26阅读更多 →
瑞萨CCE4511评估板硬件设计解析:从电源时钟到SPI与驱动接口

瑞萨CCE4511评估板硬件设计解析:从电源时钟到SPI与驱动接口

1. 评估板电路设计核心思路与架构解析拿到瑞萨CCE4511-EVAL-V1评估板的原理图,第一眼可能会被密密麻麻的元件和网络标签搞得有点懵。但别慌,咱们把它拆开来看,其实核心思路非常清晰。这张图本质上是一个硬件翻译器,它的任务是把CC…

2026/6/27 12:50:26阅读更多 →
瑞萨CCE4511评估板原理图深度解析:从电源设计到信号完整性

瑞萨CCE4511评估板原理图深度解析:从电源设计到信号完整性

1. 项目概述与核心芯片解析 在工业控制和嵌入式硬件开发领域,拿到一块评估板,第一件事往往不是急着上电跑例程,而是静下心来,把它的原理图吃透。这就像拿到一张藏宝图,图上每一个符号、每一条连线,都指向了…

2026/6/27 12:50:26阅读更多 →
RL78 MCU FAA加速DSC滤波器库配置与性能优化实战

RL78 MCU FAA加速DSC滤波器库配置与性能优化实战

1. 项目概述:在RL78 MCU上榨干FAA的每一分性能在嵌入式信号处理项目里摸爬滚打十几年,我见过太多工程师面对实时滤波需求时的两难境地:要么用软件算法硬扛,结果CPU占用率飙升,系统响应迟缓;要么外挂一颗DSP…

2026/6/27 12:45:26阅读更多 →
【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体 一文搞定到底什么是智能体【人工智能】一文搞定到底什么是智能体一. LM,WorkFlow,Agent分别有什么么不同二. Agent的思考过程是怎样的三. Agent的五个核心部分1)LLM2)Prompt3)Me…

2026/6/27 11:20:40阅读更多 →
嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

1. 嵌入式GUI控件:从原理到实战的深度解析在嵌入式系统开发中,图形用户界面(GUI)的设计与实现往往是项目从“能用”到“好用”的关键一跃。不同于资源充沛的PC或移动平台,嵌入式设备的GUI需要在有限的CPU性能、内存空间…

2026/6/27 5:46:02阅读更多 →
Google AI Studio 300美元额度的真相与实战指南

Google AI Studio 300美元额度的真相与实战指南

1. 这300美金不是“送钱”,而是Google埋下的第一道技术门槛 你看到标题里那个醒目的“$300美金”时,第一反应可能是:又一个免费额度?领完就完事?我亲手试过——这300美金根本不是红包,而是一张入场券&…

2026/6/27 11:20:39阅读更多 →
10分钟AI语音克隆与实时变声:Retrieval-based-Voice-Conversion-WebUI完整指南

10分钟AI语音克隆与实时变声:Retrieval-based-Voice-Conversion-WebUI完整指南

10分钟AI语音克隆与实时变声&#xff1a;Retrieval-based-Voice-Conversion-WebUI完整指南 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Retrie…

2026/6/27 0:04:03阅读更多 →
Layerdivider:3分钟AI智能分层,彻底告别手动抠图时代

Layerdivider:3分钟AI智能分层,彻底告别手动抠图时代

Layerdivider&#xff1a;3分钟AI智能分层&#xff0c;彻底告别手动抠图时代 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 还在为复杂的图像分层工作烦…

2026/6/27 0:04:03阅读更多 →
Tomcat中X-Frame-Options配置实战:防御点击劫持的四种方法与最佳实践

Tomcat中X-Frame-Options配置实战:防御点击劫持的四种方法与最佳实践

1. 项目概述&#xff1a;为什么X-Frame-Options是Web安全的“防盗门”&#xff1f;最近在排查一个老项目的安全审计报告时&#xff0c;又被提到了“点击劫持”风险&#xff0c;矛头直指缺失的X-Frame-Options响应头。这已经不是第一次了&#xff0c;很多开发团队&#xff0c;尤…

2026/6/27 0:04:03阅读更多 →