HarmonyOS7 PreferenceManager 本地存储封装:小项目也要写得稳

发布时间:2026/9/14 18:52:07

HarmonyOS7 PreferenceManager 本地存储封装:小项目也要写得稳 文章目录为什么需要 Preferences单例写法初始化依赖 UIContextsetValue 做了 JSON 序列化getValue 再解析回来如果要做“不再提示”怎么写写在最后智感握姿项目里有个PreferenceManager目前用得不算多但它的封装方式值得单独讲。小项目也提前封装本地存储后面加“下次不再提示”这类功能会舒服很多。项目源码https://gitcode.com/HarmonyOS_Samples/SmartReach/tree/master为什么需要 Preferences这个项目启动时会弹一个提示弹窗告诉用户智感握姿怎么体验。真实产品里通常会有“我知道了”“不再提醒”这类逻辑。Preferences就适合存这种轻量数据开关、标记、简单配置。单例写法PreferenceManager.ets里先做了单例exportclassPreferenceManager{privatepreferences?:preferences.Preferences;privatestaticinstance:PreferenceManager;privateconstructor(){this.initPreference(PREFERENCES_NAME);}publicstaticgetInstance():PreferenceManager{if(!PreferenceManager.instance){PreferenceManager.instancenewPreferenceManager();}returnPreferenceManager.instance;}}这样页面里只需要privatepreferenceManagerPreferenceManager.getInstance();不用每个页面都自己初始化一次存储对象。初始化依赖 UIContext初始化代码是privateinitPreference(storeName:string):void{constuiContext:UIContext|undefinedAppStorageV2.connect(UIContext,StorageKey.UI_CONTEXT);try{if(!uiContext){Logger.error(TAG,initPreference failed, cause uiContext is undefined.);return;}this.preferencespreferences.getPreferencesSync(uiContext.getHostContext()asContext,{name:storeName});}catch(err){Logger.error(TAG,initPreference failed, err code:${err.code},msg:${err.message});}}这里能看出前面WindowUtil存UIContext的价值。没有上下文Preferences 初始化不了。setValue 做了 JSON 序列化存值代码publicsetValueT(key:string,value:T,retry:booleantrue):void{if(this.preferences){try{this.preferences.putSync(key,JSON.stringify(value));this.saveValue();}catch(e){Logger.error(TAG,Preferences put${key}failed, err code:${e?.code},msg:${e?.message});}}else{if(retry){this.initPreference(PREFERENCES_NAME);this.setValueT(key,value,false);}}}它没有只存字符串而是把泛型值JSON.stringify()后再存。这样布尔值、数字、简单对象都能统一处理。getValue 再解析回来读取时再解析publicgetValueT(key:string,defaultValue?:ValueType,retry:booleantrue):T|null{if(this.preferences){try{constresthis.preferences.getSync(key,defaultValue)letvalue:T|nullnull;if(res){valueJSON.parse(resasstring)asT;}returnvalue;}catch(err){Logger.error(TAG,Preferences get${key}failed. err code:${err.code},msg:${err.message});returnnull;}}returnnull;}这里的retry设计也挺贴心。如果第一次发现preferences还没初始化会再尝试初始化一次而不是直接失败。如果要做“不再提示”怎么写示例里定义了constNEVER_ALERT_KEY:stringNEVER_ALERT;可以这样扩展constneverAlertthis.preferenceManager.getValueboolean(NEVER_ALERT_KEY,false);if(!neverAlert){this.showAlert();}this.preferenceManager.setValueboolean(NEVER_ALERT_KEY,true);这段不是当前项目完整实现但很适合基于现有封装继续加功能。写在最后PreferenceManager在这个示例里不是主角但它体现了工程意识存储初始化、异常处理、重试、序列化都提前考虑了。小白写项目时可以直接学这个套路别在页面里到处散落preferences.getPreferencesSync()。
延伸阅读

更多相关文章

2026/9/13 14:18:30

智慧校园新篇章:AI模型在作业批改与讲解中的应用探索

智慧校园新篇章:AI模型在作业批改与讲解中的应用探索 在智慧校园的建设浪潮中,教育技术的革新正以前所未有的速度改变着传统的教学模式。其中,人工智能(AI)模型的应用尤为引人注目,特别是在作业批改与讲解环…

2026/9/13 15:53:23

AI模型在供应链风险预警文本分析中的应用探索

AI模型在供应链风险预警文本分析中的应用探索 在当今全球化的商业环境中,供应链的稳定运行对于企业的生存和发展至关重要。然而,供应链面临着诸多不确定因素,如自然灾害、政治动荡、市场波动等,这些因素都可能引发供应链中断&…

2026/9/13 5:05:48

Postgres bgworker

路径一:RegisterBackgroundWorker(静态注册) 入口:bgworker.c:871-943 调用方:在 shared_preload_libraries 加载的模块的 _PG_init() 函数中调用 调用流程 RegisterBackgroundWorker(worker) …

2026/9/14 18:50:19

React Native集成YOLO11实现移动端实时物体检测

1. React Native与YOLO11结合的背景与价值移动端实时物体检测正在成为计算机视觉领域的重要应用方向。传统方案通常需要将图像数据上传至云端服务器进行处理,这种方式存在延迟高、隐私风险大、网络依赖性强等明显缺陷。而React Native作为跨平台移动开发框架&#x…

2026/9/14 18:45:19

Node.js+Vue+ECharts:学生课外活动管理系统可视化大屏实战

先用一句话讲清楚这个项目是干什么的:这是一套以 Node.js 做后端、Vue 做前端的学生课外活动管理系统,在完成报名、审核、积分等常规业务的同时,单独抽出一块“数据可视化大屏分析系统”,用图表方式把活动分布、参与热度、学院排名…

2026/9/14 2:17:50

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/14 0:03:22

KCF目标跟踪算法与OTB工程实现:毕业设计实战解析

简介:这是一份基于KCF核相关滤波算法、融合尺度池与抗遮挡处理的目标检测跟踪MATLAB完整源码,主要面向计算机相关专业准备毕业设计、课程设计或期末大作业的学生,也适合需要项目实战练习的初学者。源码在OTB数据集上完成验证,能够…

2026/9/14 0:03:22

语音情感识别实战:Keras实现LSTM、CNN、SVM与MLP多模型对比

简介:面向语音情感识别入门与进阶开发者,这份基于Keras的项目源码完整实现了LSTM、CNN、SVM、MLP四种模型,兼容Python3.8与Keras/TensorFlow2环境。压缩包内含49个文件,大小约70.31MB,主体包括Python脚本、yaml/json配…

2026/9/14 11:59:31

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/14 13:53:59

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/14 11:22:57

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码