HarmonyOS主题管理工具封装:动态切换、持久化存储与常见问题解析

news2025/4/1 5:38:04

注:适用版本(Harmony OS NEXT / 5.0 / API 12+ )

一、效果展示

                                              

二、技术栈           

  1. HarmonyOS ArkUI框架

    使用AppStorage实现跨组件状态管理,PersistentStorage持久化存储用户偏好。
  2. 系统配置常量

    ConfigurationConstant.ColorMode定义系统支持的颜色模式(浅色/深色/未设置)。
  3. UIAbility上下文

    通过common.UIAbilityContext获取应用上下文,调用setColorMode同步系统级主题配置。
  4. 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 方法来设置应用的颜色模式。

noSetlight 和 dark 方法

  • 功能:分别把主题设置为未设置、浅色和深色模式。

  • 实现方式:调用 setTheme 方法并传入对应的颜色模式常量。

四、常见问题

  • 持久化存储未初始化

    • 现象:首次启动时主题未按预期加载。

    • 解决:确保initTheme()在应用启动时调用,且PersistentStorage.persistProp优先于其他逻辑。

  • 上下文获取失败

    • 现象ctxundefined,调用setColorMode报错。

    • 解决:检查AppStoragecontext是否正确注入,或通过getContext动态获取。

  • 颜色模式未同步

    • 现象AppStorage与系统实际模式不一致。

    • 解决:在setTheme中显式调用ctx.getApplicationContext().setColorMode(model),并监听系统配置变化。

  • 枚举值误用

    • 现象:错误使用COLOR_MODE_NOT_SET导致主题异常。

    • 解决:仅在需要系统默认行为时使用noSet(),通常应明确指定LIGHTDARK

  • 异步存储延迟

    • 现象:主题切换后界面未立即刷新。

    • 解决:使用@StorageLink装饰器绑定UI组件,或手动触发getUIAbilityContext().setColorMode()

五、总结

        通过合理封装 HarmonyOS 原生 API,开发者可以轻松实现动态主题管理功能。本文的 Theme 工具类提供了一套完整的解决方案,涵盖持久化存储、系统配置同步与常见问题规避。在实际开发中,建议结合业务需求扩展主题体系,并始终关注上下文有效性及状态同步的原子性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2324090.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

60V单通道高精度线性恒流LED驱动器防60V反接SOD123封装

产品描述: PC561A 系列产品是用于产生单通道、高精度恒流源&#xff08; Constant Current Regulator&#xff0c; CCR&#xff09; 的LED 驱动芯片&#xff0c;为各类 LED 照明应用提供高性价比恒流方案。PC561A 采用晶体管自偏置技术&#xff0c;可在超宽工作电压范围内维持…

学习threejs,使用Sprite精灵、SpriteMaterial精灵材质

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.Sprite1.1.1 ☘️代码…

Cent OS7+Docker+Dify

由于我之前安装了Dify v1.0.0&#xff0c;出现了一些问题&#xff1a;无法删除&#xff0c;包括&#xff1a;知识库中的文件、应用、智能体、工作流&#xff0c;都无法删除。现在把服务器初始化&#xff0c;一步步重新安装&#xff0c;从0到有。 目录 1、服务器重装系统和配置…

本地AI大模型部署革命:Ollama部署和API调试教程

Ollama&#xff1a;你的私人AI助手 还在为云端AI服务的高昂费用和隐私问题而烦恼吗&#xff1f;Ollama横空出世&#xff0c;它是一款专为本地环境打造的大模型部署神器&#xff0c;让你轻松在自己的设备上运行各种强大的AI模型。无论你是开发者还是普通用户&#xff0c;Ollama…

centos7 linux VMware虚拟机新添加的网卡,能看到网卡名称,但是看不到网卡的配置文件

问题现象&#xff1a;VMware虚拟机新添加的网卡&#xff0c;能看到网卡&#xff0c;但是看不到网卡的配置文件 解决方案&#xff1a; nmcli connection show nmcli connection add con-name ens36 ifname ens36 type ethernet #创建一个网卡连接配置文件&#xff0c;这里con…

K8S学习之基础五十一:k8s部署jenkins

k8s部署jenkins 创建nfs共享目录&#xff0c; 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;的魔法指南!!!

&#x1f409; 在 Mermaid 流程图里“驯服”"的魔法指南 在使用 Mermaid 画流程图时&#xff0c;是不是经常遇到想秀一波 &quot; 却被它“反杀”的情况&#xff1f;&#x1f3af; 今天就来教大家如何在这头代码野兽的嘴里&#xff0c;抢回我们的双引号实体编码&#…

GitHub美化个人主页3D图表显示配置操作

这个功能主要是用的这个开源仓库&#xff1a;https://github.com/yoshi389111/github-profile-3d-contrib 想看效果的话&#xff0c;我的个人主页&#xff1a;https://github.com/Sjj1024 开始操作 1.创建自己的github主页属性项目——跟你github用户名一致即可&#xff0c;…

HarmonyOS NEXT 鸿蒙中关系型数据库@ohos.data.relationalStore API 9+

核心API ohos.data.relationalStore API 9 数据库 数据库是存储和管理数据的系统 数据库&#xff08;Database&#xff09;是一个以特定方式组织、存储和管理数据的集合&#xff0c;通常用于支持各种应用程序和系统的运行。它不仅是存放数据的仓库&#xff0c;还通过一定的…

【JavaScript】JavaScript Promises实践指南

【JavaScript】JavaScript Promises实践指南 你了解JavaScript中的Promises吗&#xff1f;这是一个很多人一开始就放弃的主题&#xff0c;但我会尽量让它变得尽可能简单。 1. “Promise”到底是什么&#xff1f; “Promise”是异步编程中的一个基本概念&#xff0c;特别是在J…

git push的时候出现无法访问的解决

fatal: 无法访问 https://github.com/...&#xff1a;gnutls_handshake() failed: Error in the pull function. push的时候没有输入自己的github账号密码&#xff0c;为了解决每次push都要登录github这个问题&#xff0c;采用ssh密钥的方式认证&#xff0c;可以免去每次都输入…

为什么大模型在 OCR 任务上表现不佳?

编者按&#xff1a; 你是否曾经用最先进的大语言模型处理企业文档&#xff0c;却发现它把财务报表中的“$1,234.56”读成了“123456”&#xff1f;或者在处理医疗记录时&#xff0c;将“0.5mg”误读为“5mg”&#xff1f;对于依赖数据准确性的运营和采购团队来说&#xff0c;这…

HCIP(VLAN综合实验)

实验拓补图 实验分析 一、实验目的 掌握VLAN的创建和配置方法理解VLAN在局域网中的作用学习如何通过VLAN实现网络隔离和通信 二、实验环境 交换机&#xff08;SW1、SW2、SW3&#xff09;个人电脑&#xff08;PC1、PC2、PC3、PC4、PC5、PC6&#xff09;路由器&#xff08;R1…

每日算法-250328

记录今天学习和解决的LeetCode算法题。 92. 反转链表 II 题目 思路 本题要求反转链表中从 left 到 right 位置的节点。我们可以采用 头插法 的思路来反转指定区间的链表。 具体来说&#xff0c;我们首先定位到 left 位置节点的前一个节点 prev。然后&#xff0c;从 left 位置…

从 Word 到 HTML:使用 Aspose.Words 轻松实现 Word 文档的高保真转换

从 Word 到 HTML&#xff1a;使用 Aspose.Words 轻松实现 Word 文档的高保真转换 前言一、环境准备二、核心代码实现1. 将 Word 转换为 HTML 文件流2. 优化超链接样式 三、测试效果四、总结 前言 在日常开发中&#xff0c;我们经常需要将 Word 文档转换为 HTML&#xff0c;用于…

RSA 简介及 C# 和 js 实现【加密知多少系列_4】

〇、简介 谈及 RSA 加密算法&#xff0c;我们就需要先了解下这两个专业名词&#xff0c;对称加密和非对称加密。 对称加密&#xff1a;在同一密钥的加持下&#xff0c;发送方将未加密的原文&#xff0c;通过算法加密成密文&#xff1b;相对的接收方通过算法将密文解密出来原文…

机器学习——LightGBM

LightGBM(light gradient boosting machine&#xff0c;轻量梯度提升机)是对XGBoost进行改进的模型版本&#xff0c;其三者之间的演变关系为&#xff1a;GBDT-》XGBoost-》LightGBM&#xff0c;依次对性能进行优化&#xff0c;尽管XGBoost已经很高效了&#xff0c;但是仍然有缺…

故障识别 | 基于改进螂优化算法(MSADBO)优化变分模态提取(VME)结合稀疏最大谐波噪声比解卷积(SMHD)进行故障诊断识别,matlab代码

基于改进螂优化算法&#xff08;MSADBO&#xff09;优化变分模态提取&#xff08;VME&#xff09;结合稀疏最大谐波噪声比解卷积&#xff08;SMHD&#xff09;进行故障诊断识别 一、引言 1.1 机械故障诊断的背景和意义 在工业生产的宏大画卷中&#xff0c;机械设备的稳定运行…

[已解决]服务器CPU突然飙高98%----Java程序OOM问题 (2024.9.5)

目录 问题描述问题排查问题解决参考资料 问题描述 业主单位服务器自8月29日晚上21:00起CPU突然飙高至98%&#xff0c;内存爆满&#xff0c;一直到9月5日&#xff1a; 问题排查 ①执行 top 命令查看Java进程PID top②执行top -Hp PID 命令查看具体的线程情况 top -Hp 3058输入上…

Ai工作流工具有那些如Dify、coze扣子等以及他们是否开源

Dify &#xff08;https://difycloud.com/&#xff09; 核心定位&#xff1a;专业级 LLM 应用开发平台&#xff0c;支持复杂 AI 工作流构建与企业级管理。典型场景&#xff1a;企业智能客服、数据分析系统、复杂自动化流程构建等。适合需要深度定制、企业级管理和复杂 AI 逻辑…