news 2026/7/24 9:15:02

鸿蒙三方库 | harmony-utils之PreferencesUtil首选项数据监听详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
鸿蒙三方库 | harmony-utils之PreferencesUtil首选项数据监听详解

前言

首选项数据监听可以让应用实时感知配置变化,如主题切换、语言变更等。@pura/harmony-utilsPreferencesUtil封装了数据变化监听方法。本文将从API说明、代码实战、进阶用法、常见问题等多个维度进行全面讲解,帮助开发者快速掌握并应用到实际项目中。

一、PreferencesUtil监听核心API

PreferencesUtil提供了以下数据监听方法:

方法说明参数使用场景
onDataChange(callback)订阅数据变化callback实时配置感知
offDataChange(callback)取消数据变化订阅callback释放资源

1.1 核心特性

  • 简洁易用:封装复杂API为一行调用,降低使用门槛
  • 类型安全:完整的TypeScript类型定义,编译期即可发现错误
  • 异常处理:内置异常捕获机制,避免运行时崩溃
  • 实时感知:数据变化时立即触发回调

1.2 监听应用场景

场景监听Key响应行为
主题切换theme更新UI主题
语言变更language刷新文本
登录状态is_logged_in更新导航栏

二、完整使用步骤

2.1 安装依赖

ohpminstall@pura/harmony-utils

2.2 订阅数据变化

import{PreferencesUtil}from'@pura/harmony-utils';privatedataCallback=(key:string)=>{this.result=`数据变化:${key}`;};aboutToAppear(){PreferencesUtil.onDataChange(this.dataCallback);}aboutToDisappear(){PreferencesUtil.offDataChange(this.dataCallback);}

2.3 实时响应配置变化

PreferencesUtil.onDataChange((key)=>{if(key==='theme'){this.loadTheme();}elseif(key==='language'){this.loadLanguage();}});

三、完整页面示例

import{PreferencesUtil}from'@pura/harmony-utils';@Entry@Componentstruct PrefListenerDemo{@Stateresult:string='等待数据变化...';aboutToAppear(){PreferencesUtil.onDataChange((key)=>{this.result=`数据变化:${key}`;});}aboutToDisappear(){PreferencesUtil.offDataChange();}build(){Column({space:12}){Button('修改数据触发监听').width('100%').onClick(async()=>{awaitPreferencesUtil.putString('test_key','new_value');awaitPreferencesUtil.flush();});Text(this.result).fontSize(14).fontColor('#333333')}.padding(16)}}

四、进阶用法

4.1 配置变化管理器

import{PreferencesUtil}from'@pura/harmony-utils';classConfigManager{privatestatichandlers:Record<string,Function>={};staticinit():void{PreferencesUtil.onDataChange((key:string)=>{lethandler=ConfigManager.handlers[key];if(handler)handler();});}staticregister(key:string,handler:Function):void{ConfigManager.handlers[key]=handler;}}

4.2 主题切换响应

ConfigManager.register('theme',()=>{lettheme=PreferencesUtil.getString('theme','light');AppStorage.setOrCreate('currentTheme',theme);});

五、注意事项

  1. 回调引用:注册和取消需使用同一回调引用
  2. 生命周期:页面销毁时务必取消订阅
  3. 性能:回调中避免耗时操作
  4. 初始化依赖:使用前需确保AppUtil.init()已调用
  5. flush触发:数据变化需flush后才触发回调

六、常见问题

Q1: 数据变化后回调不触发?

确保调用了flush()方法,只有持久化后才会触发变化通知。

Q2: 可以监听特定key的变化吗?

回调参数包含变化的key,可以在回调中判断具体key。

Q3: 多次订阅会触发多次吗?

是的,每个订阅的回调都会触发,注意避免重复订阅。

Q4: 取消订阅后还会收到回调吗?

不会,取消订阅后不再触发回调。


总结

PreferencesUtil的数据监听方法为配置变化实时感知提供了便捷支持。本文详细介绍了核心API、使用步骤、完整示例、进阶用法以及常见问题的解决方案。合理使用数据监听,可以实现主题切换、语言变更等实时响应功能。

本文基于@pura/harmony-utils工具库,更多功能请参考官方文档与后续系列文章。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/24 9:12:22

MSP430电源管理模块PMM深度解析:SVS/SVM监控与VCORE动态调节实战

1. 项目概述与PMM模块的核心价值 在嵌入式系统&#xff0c;尤其是那些对功耗极其敏感的电池供电设备里&#xff0c;电源的稳定性是系统可靠性的生命线。想象一下&#xff0c;你精心设计的无线传感器节点部署在野外&#xff0c;依靠一枚纽扣电池工作数年&#xff0c;突然因为一次…

作者头像 李华
网站建设 2026/7/24 9:12:07

UE5 GAS模块化GameplayEffect设计:解决RPG技能系统维护难题

1. 项目概述&#xff1a;为什么GAS的GameplayEffect需要模块化&#xff1f; 如果你正在用UE5的GameplayAbilitySystem&#xff08;GAS&#xff09;做RPG&#xff0c;那你肯定对GameplayEffect&#xff08;GE&#xff09;又爱又恨。爱的是它功能强大&#xff0c;一个GE就能搞定伤…

作者头像 李华
网站建设 2026/7/24 9:10:54

Unity VR操控六轴机械臂:数字孪生与ROS通信实践

1. 项目概述与核心价值最近在做一个挺有意思的Demo&#xff0c;核心目标是用VR手柄来实时控制一台六轴机械臂的运动。听起来像是科幻电影里的场景&#xff0c;但用Unity3D 5.4.2这个“经典”版本&#xff0c;配合一些成熟的插件和通信协议&#xff0c;完全可以在实验室环境下跑…

作者头像 李华
网站建设 2026/7/24 9:10:36

ComfyUI图像放大技术:原理、工作流与优化

1. ComfyUI图像放大核心原理剖析 在数字图像处理领域&#xff0c;高清放大技术经历了从传统插值到AI智能重建的演进过程。传统双三次插值等算法仅通过数学计算填充像素&#xff0c;而基于深度学习的ESRGAN&#xff08;Enhanced Super-Resolution Generative Adversarial Networ…

作者头像 李华
网站建设 2026/7/24 9:09:15

ADS7851EVM-PDK评估套件:双通道同步采样ADC性能评估与实战指南

1. 项目概述&#xff1a;深入解析ADS7851EVM-PDK评估套件在嵌入式系统、工业自动化以及高精度测量领域&#xff0c;模数转换器&#xff08;ADC&#xff09;的性能往往是决定整个系统精度的瓶颈。当我们需要同时捕捉两个相关信号&#xff0c;例如三相电机控制中的两相电流、电力…

作者头像 李华
网站建设 2026/7/24 9:07:39

C++自定义异常类设计:从基础原理到工业级实现

1. 项目概述&#xff1a;为什么我们需要自定义异常类&#xff1f;在C的世界里&#xff0c;异常处理是构建健壮、可靠程序的关键防线。标准库提供了一套基础的异常类型&#xff0c;比如std::runtime_error、std::logic_error&#xff0c;它们能处理很多通用错误。但当你深入到一…

作者头像 李华