HarmonyOS主题管理工具封装:动态切换、持久化存储与常见问题解析
注:适用版本(Harmony OS NEXT / 5.0 / API 12+ )
一、效果展示

二、技术栈
-
HarmonyOS ArkUI框架
使用AppStorage实现跨组件状态管理,PersistentStorage持久化存储用户偏好。 -
系统配置常量
ConfigurationConstant.ColorMode定义系统支持的颜色模式(浅色/深色/未设置)。 -
UIAbility上下文
通过common.UIAbilityContext获取应用上下文,调用setColorMode同步系统级主题配置。 -
TypeScript
强类型定义(如ColorModeKey常量、泛型方法persistProp<T>)提升代码健壮性。
| 技术组件 | 作用 | 原理 |
|---|---|---|
| PersistentStorage | 持久化存储键值对数据,适用于高频访问的小数据量场景 | 底层使用轻量级数据库,以实现数据的持久化存储 |
| AppStorage | 作为全局状态管理中心,支持组件数据的自动刷新 | 采用发布 - 订阅模式,组件通过 @StorageLink 绑定数据,当数据更新时,绑定的组件会自动刷新 |
| UIAbilityContext | 提供应用运行时的上下文信息,并允许修改系统级配置 | 在应用运行时提供相关上下文信息,如 config.colorMode,同时具备修改系统级配置的能力 |
| ConfigurationConstant | 提供系统常量,确保与HarmonyOS 原生行为一致 |
三、详细源码及分析
// 导入AbilityKit模块中的ConfigurationConstant和Context类
import { common, ConfigurationConstant, Context } from '@kit.AbilityKit'// 定义ColorModeKey常量,用于存储颜色模式的键值
export const ColorModeKey = 'hm_colorMode_key'// 定义Theme类,用于管理应用的主题
class Theme {// 初始化主题方法initTheme() {// 使用PersistentStorage持久化存储颜色模式,默认为浅色模式PersistentStorage.persistProp<ConfigurationConstant.ColorMode>(ColorModeKey,ConfigurationConstant.ColorMode.COLOR_MODE_LIGHT)// 从AppStorage中获取当前的颜色模式const colorMode = AppStorage.get<ConfigurationConstant.ColorMode>(ColorModeKey)// 调用setTheme方法设置主题this.setTheme(colorMode!)}// 设置主题方法setTheme(model: ConfigurationConstant.ColorMode) {// 将颜色模式存储到AppStorage中AppStorage.setOrCreate(ColorModeKey, model)// 从AppStorage中获取上下文对象const ctx = AppStorage.get<Context>('context')AppStorage.setOrCreate('isDark',(ctx as common.UIAbilityContext).config.colorMode === ConfigurationConstant.ColorMode.COLOR_MODE_DARK)// 如果上下文对象存在,则设置应用的颜色模式if (ctx) {ctx.getApplicationContext().setColorMode(model)}}// 设置主题为未设置状态的方法noSet() {this.setTheme(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET)}// 设置主题为浅色模式的方法light() {this.setTheme(ConfigurationConstant.ColorMode.COLOR_MODE_LIGHT)}// 设置主题为深色模式的方法dark() {this.setTheme(ConfigurationConstant.ColorMode.COLOR_MODE_DARK)}
}// 导出Theme类的实例
export const theme = new Theme()
initTheme方法
功能:对主题进行初始化操作。
步骤:
运用
PersistentStorage.persistProp方法把默认的颜色模式(浅色模式)持久化存储起来。从
AppStorage中获取当前的颜色模式。调用
setTheme方法来设置主题。
setTheme方法
功能:设置应用的主题。
步骤:
把传入的颜色模式存储到
AppStorage里。从
AppStorage中获取上下文对象ctx。依据上下文对象的颜色模式,在
AppStorage中设置isDark标志。若上下文对象存在,就调用
getApplicationContext().setColorMode方法来设置应用的颜色模式。
noSet、light和dark方法
功能:分别把主题设置为未设置、浅色和深色模式。
实现方式:调用
setTheme方法并传入对应的颜色模式常量。
四、常见问题
持久化存储未初始化
现象:首次启动时主题未按预期加载。
解决:确保
initTheme()在应用启动时调用,且PersistentStorage.persistProp优先于其他逻辑。上下文获取失败
现象:
ctx为undefined,调用setColorMode报错。解决:检查
AppStorage中context是否正确注入,或通过getContext动态获取。颜色模式未同步
现象:
AppStorage与系统实际模式不一致。解决:在
setTheme中显式调用ctx.getApplicationContext().setColorMode(model),并监听系统配置变化。枚举值误用
现象:错误使用
COLOR_MODE_NOT_SET导致主题异常。解决:仅在需要系统默认行为时使用
noSet(),通常应明确指定LIGHT或DARK。异步存储延迟
现象:主题切换后界面未立即刷新。
解决:使用
@StorageLink装饰器绑定UI组件,或手动触发getUIAbilityContext().setColorMode()。
五、总结
通过合理封装 HarmonyOS 原生 API,开发者可以轻松实现动态主题管理功能。本文的 Theme 工具类提供了一套完整的解决方案,涵盖持久化存储、系统配置同步与常见问题规避。在实际开发中,建议结合业务需求扩展主题体系,并始终关注上下文有效性及状态同步的原子性。
相关文章:
HarmonyOS主题管理工具封装:动态切换、持久化存储与常见问题解析
注:适用版本(Harmony OS NEXT / 5.0 / API 12 ) 一、效果展示 二、技术栈 HarmonyOS ArkUI框架 使用AppStorage实现跨组件状态管理,PersistentStorage持久化存储用户偏好。 系统配置常量 ConfigurationConstant.Color…...
60V单通道高精度线性恒流LED驱动器防60V反接SOD123封装
产品描述: PC561A 系列产品是用于产生单通道、高精度恒流源( Constant Current Regulator, CCR) 的LED 驱动芯片,为各类 LED 照明应用提供高性价比恒流方案。PC561A 采用晶体管自偏置技术,可在超宽工作电压范围内维持…...
学习threejs,使用Sprite精灵、SpriteMaterial精灵材质
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.Sprite1.1.1 ☘️代码…...
网络相关的知识总结1
1.设备可以通过以太网电缆(如双绞线)连接到交换机的端口,交换机也通过以太网电缆连接到路由器。但是如果距离过远,比如跨国路由器如何连接? 1.专用通信线路(如 MPLS、光纤专线):租用…...
Cent OS7+Docker+Dify
由于我之前安装了Dify v1.0.0,出现了一些问题:无法删除,包括:知识库中的文件、应用、智能体、工作流,都无法删除。现在把服务器初始化,一步步重新安装,从0到有。 目录 1、服务器重装系统和配置…...
本地AI大模型部署革命:Ollama部署和API调试教程
Ollama:你的私人AI助手 还在为云端AI服务的高昂费用和隐私问题而烦恼吗?Ollama横空出世,它是一款专为本地环境打造的大模型部署神器,让你轻松在自己的设备上运行各种强大的AI模型。无论你是开发者还是普通用户,Ollama…...
centos7 linux VMware虚拟机新添加的网卡,能看到网卡名称,但是看不到网卡的配置文件
问题现象:VMware虚拟机新添加的网卡,能看到网卡,但是看不到网卡的配置文件 解决方案: nmcli connection show nmcli connection add con-name ens36 ifname ens36 type ethernet #创建一个网卡连接配置文件,这里con…...
SRT协议
SRT(Secure Reliable Transport)是一种开源的视频传输协议,专为高丢包、高延迟网络环境设计,结合了UDP的低延迟和TCP的可靠性,广泛应用于直播、远程制作、视频会议等场景。 定位:SRT协议的官方C/C实现库&am…...
K8S学习之基础五十一:k8s部署jenkins
k8s部署jenkins 创建nfs共享目录, mkdir -p /data/v2 echo /data/v2 *(rw,no_root_squash) > /etc/exports exportfs -arv创建pv、pvc vi pv.yaml apiVersion: v1 kind: PersistentVolume metadata:name: jenkins-k8s-pv spec:capacity:storage: 1GiaccessMod…...
在 Mermaid 流程图里“驯服”quot;的魔法指南!!!
🐉 在 Mermaid 流程图里“驯服”"的魔法指南 在使用 Mermaid 画流程图时,是不是经常遇到想秀一波 " 却被它“反杀”的情况?🎯 今天就来教大家如何在这头代码野兽的嘴里,抢回我们的双引号实体编码&#…...
GitHub美化个人主页3D图表显示配置操作
这个功能主要是用的这个开源仓库:https://github.com/yoshi389111/github-profile-3d-contrib 想看效果的话,我的个人主页:https://github.com/Sjj1024 开始操作 1.创建自己的github主页属性项目——跟你github用户名一致即可,…...
欧几里得距离(Euclidean Distance)公式
欧几里得距离公式 欧几里得距离(Euclidean Distance)是计算两点之间直线距离的一种方法。它是最常见的距离度量方式之一,广泛应用于数学、物理、机器学习、计算机视觉等领域。 公式定义 1. 二维空间 在二维平面上,假设有两个点…...
HarmonyOS NEXT 鸿蒙中关系型数据库@ohos.data.relationalStore API 9+
核心API ohos.data.relationalStore API 9 数据库 数据库是存储和管理数据的系统 数据库(Database)是一个以特定方式组织、存储和管理数据的集合,通常用于支持各种应用程序和系统的运行。它不仅是存放数据的仓库,还通过一定的…...
【JavaScript】JavaScript Promises实践指南
【JavaScript】JavaScript Promises实践指南 你了解JavaScript中的Promises吗?这是一个很多人一开始就放弃的主题,但我会尽量让它变得尽可能简单。 1. “Promise”到底是什么? “Promise”是异步编程中的一个基本概念,特别是在J…...
【软件工程】习题及答案
目录 第一章 习题第一章 习题答案第二章 习题第二章 习题答案第三章 习题第三章 习题答案第四章 习题第四章 习题答案第五章 习题第五章 习题答案第六章 习题第六章 习题答案第七章 习题第七章 习题答案 第一章 习题 一、选择题 1.关于引起软件危机的原因ÿ…...
git push的时候出现无法访问的解决
fatal: 无法访问 https://github.com/...:gnutls_handshake() failed: Error in the pull function. push的时候没有输入自己的github账号密码,为了解决每次push都要登录github这个问题,采用ssh密钥的方式认证,可以免去每次都输入…...
《深度剖析Android 12 SystemUI锁屏通知布局亮屏流程:从源码到实现》
优化后文章结构: 1. 前言 强调锁屏通知布局的重要性及分析目的,引出后续源码分析的必要性。 2. 核心类解析 KeyguardViewMediator:锁屏核心逻辑控制,处理亮屏/息屏事件分发。 PhoneWindowManager:系统输入事件&…...
为什么大模型在 OCR 任务上表现不佳?
编者按: 你是否曾经用最先进的大语言模型处理企业文档,却发现它把财务报表中的“$1,234.56”读成了“123456”?或者在处理医疗记录时,将“0.5mg”误读为“5mg”?对于依赖数据准确性的运营和采购团队来说,这…...
HCIP(VLAN综合实验)
实验拓补图 实验分析 一、实验目的 掌握VLAN的创建和配置方法理解VLAN在局域网中的作用学习如何通过VLAN实现网络隔离和通信 二、实验环境 交换机(SW1、SW2、SW3)个人电脑(PC1、PC2、PC3、PC4、PC5、PC6)路由器(R1…...
每日算法-250328
记录今天学习和解决的LeetCode算法题。 92. 反转链表 II 题目 思路 本题要求反转链表中从 left 到 right 位置的节点。我们可以采用 头插法 的思路来反转指定区间的链表。 具体来说,我们首先定位到 left 位置节点的前一个节点 prev。然后,从 left 位置…...
从 Word 到 HTML:使用 Aspose.Words 轻松实现 Word 文档的高保真转换
从 Word 到 HTML:使用 Aspose.Words 轻松实现 Word 文档的高保真转换 前言一、环境准备二、核心代码实现1. 将 Word 转换为 HTML 文件流2. 优化超链接样式 三、测试效果四、总结 前言 在日常开发中,我们经常需要将 Word 文档转换为 HTML,用于…...
Android 设备实现 adb connect 连接的步骤
1. 检查设备的开发者选项 确保平板设备已开启开发者模式,并启用了USB调试。 2. 检查设备和电脑的网络连接 确保平板和电脑连接到同一个Wi-Fi网络,确认设备的 IP 地址是否正确。 通过 ping 命令测试: ping 192.168.3.243. 通过USB线进行初…...
【人工智能】解锁大模型潜力:Ollama 与 DeepSeek 的分布式推理与集群部署实践
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着大语言模型(LLM)的快速发展,其推理能力在自然语言处理、代码生成等领域展现出巨大潜力。然而,单机部署难以满足高并发、低延迟的需…...
离散的数据及参数适合用什么算法做模型
离散数据和参数适用的机器学习算法取决于具体任务(分类、回归、聚类等)、数据特点(稀疏性、类别数量等)以及业务需求。以下是针对离散数据的常用算法分类和选择建议: 1. 分类任务(离散目标变量) 经典算法 决策树(ID3/C4.5/CART) 直接处理离散特征,无需编码,可解释性…...
VMware 安装 Ubuntu 实战分享
VMware 安装 Ubuntu 实战分享 VMware 是一款强大的虚拟机软件,广泛用于多操作系统环境的搭建。本文将详细介绍如何在 VMware 中安装 Ubuntu,并分享安装过程中的常见问题及解决方法。 1. 安装前的准备工作 (1) 系统要求 主机操作系统:Windo…...
RSA 简介及 C# 和 js 实现【加密知多少系列_4】
〇、简介 谈及 RSA 加密算法,我们就需要先了解下这两个专业名词,对称加密和非对称加密。 对称加密:在同一密钥的加持下,发送方将未加密的原文,通过算法加密成密文;相对的接收方通过算法将密文解密出来原文…...
在IDEA中快速注释所有console.log
在IDEA中快速注释所有console.log 在前端IDEA中,快速注释所有console.log语句可以通过以下步骤实现2: 打开要修改的文件。使用快捷键CtrlF打开搜索框。点击打开使用正则搜索的开关或者通过AltR快捷键来打开。在搜索框输入[]*console.log[]*,…...
GPT-4o图像生成功能:技术突破与隐忧并存
2025年3月25日,OpenAI正式推出GPT-4o原生图像生成功能,宣称其实现了“文本到图像的终极跨越”。然而,这一被市场追捧的技术在短短72小时内便因用户需求过载触发限流,暴露出算力瓶颈与商业化矛盾的尖锐性。这场技术狂欢的背后&…...
SQL语言分类及命令详解(二)
目录 一、DQL (Data Query Language) 数据查询语言 核心命令:SELECT 基本语法: 详细分析: 高级特性: 示例: 二、DDL (Data Definition Language) 数据定义语言 核心命令 CREATE ALTER DROP TRUNCATE 详细…...
机器学习——LightGBM
LightGBM(light gradient boosting machine,轻量梯度提升机)是对XGBoost进行改进的模型版本,其三者之间的演变关系为:GBDT-》XGBoost-》LightGBM,依次对性能进行优化,尽管XGBoost已经很高效了,但是仍然有缺…...
