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

发布时间:2026/11/5 0:10:40
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()。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询