鸿蒙--封装状态栏工具

本次分享使用markdown,学习并练习这个语法可以快速的记录

一、那哪里是状态栏?为什么要封装状态栏工具呢?

  • 状态栏是什么?在哪里?
    • 状态栏是 手机最顶上的那一行,显示信号、时间、电量、网速等信息的区域。
    • 如图所示,这就是手机的状态栏。
      如图所示,这就是手机的状态栏
  • 那为什么要封装状态栏呢?
    • 当我们设置沉浸模式的时候,应用的背景色会与状态栏中内容的颜色相近,这会导致无法查看状态栏内容(比如说时间、wifi、信号、电量)
    • 当然当我们封装了状态栏工具,就可以在不同的情境下使用不同的状态栏效果。

二、整体思路

1. 目的

在沉浸模式中我们可以通过状态栏工具,在不同的状态下使用不同的状态栏的效果

2. 封装工具选择

  1. 要满足特定情况下调用的效果---------interface / Function / class
  2. 要获取到上下文对象、获取窗口、设置状态栏-------Function
  3. 设置不同的属性,可以在不同的状态下调用
  4. 所以使用class比较合适

3.封装思路

  1. 导入包 window
  2. 创建类 StatusBar
  3. 首先为了方便后续设置不同的对象,我们要用函数 setWindowStatusBar 设置状态栏,这个函数的形参属性是window.SystemBarProperties
    a、接收上下文对象 AppStorage
    b、获取窗口 window.getTopWindow(a) 返回Promise
    c、设置状态栏 b.setWindowSystemBarProperties(参数)
  4. 通过函数设置不同的工具属性
  5. 实例化并导出,在不同的情境下使用

三、实现封装

1. 封装

a. 导入包 window

import { window } from '@kit.ArkUI'

b. 创建类 StatusBar

class StatusBar{}

c. 首先为了方便后续设置不同的对象,我们要用函数 setWindowStatusBar 设置状态栏,这个函数的形参属性是window.SystemBarProperties

  • 首先我们要了解setSystemBarProperties
    • setWindowSystemBarProperties(systemBarProperties: SystemBarProperties): Promise,
      可以知道这个方法内需要传参,并参数类型为SystemBarProperties,返回的是一个Promise对象,所以可以使用async函数await
    • 通过文档我们也可以得知这个方法是可以设置主窗口三键导航栏、状态栏的属性,而我们今天要封装的就是这个状态栏的工具

名称类型说明
statusBarColorstring状态栏背景颜色
statusBarContentColorstring状态栏文字颜色
  • 同样我们也要了解一下参数SystemBarProperties
    • 这是官方文档的内容我们只拿出需要的看一看
    • 今天所封装所需要的功能可以用上这两个参数,当然SystemBarProperties中也可以设置别的,大家按需书写
  • 代码部分
async  getWindowStatus(config:window.SystemBarProperties){
	// 获取上下文对象
    const context = AppStorage.get<Context>('Context')!
    // 获取应用窗口
    const win = await window.getLastWindow(context)
    // 设置状态栏
    const A = await win.setWindowSystemBarProperties(config)
  }

这里用到了Appstorage上下文对象,和获取应用窗口,那么其中的Context在获取并呗Appstorage传递到这里的呢?
(QAQ) 这里的 3.获取上下问对象

d. 过函数设置不同的工具属性

  // 深色字体
  textDark(){
    this.getWindowStatus({
      statusBarContentColor:'#000000'
    })
  }
  // 浅色字体
  lightDark(){
    this.getWindowStatus({
      statusBarContentColor:'#ffffff'
    })
  }
  // 状态栏颜色
  StatusBarColor(){
  this.getWindowStatus({
  	statusBarColor:'#282c34'
  })
  }

e. 实例化并导出

export const StatusBarconfig = new StatusBar()

2. 完整代码

import { window } from '@kit.ArkUI'

class StatusBar{
    // 设置状态栏函数方便配置状态栏的属性 
	async  getWindowStatus(config:window.SystemBarProperties){
		// 获取上下文对象
    	const context = AppStorage.get<Context>('Context')!
    	// 获取应用窗口
    	const win = await window.getLastWindow(context)
    	// 设置状态栏
    	const A = await win.setWindowSystemBarProperties(config)
  	}
    // 深色字体
	textDark(){
    	this.getWindowStatus({
      		statusBarContentColor:'#000000'
    		})
  	}
  	// 浅色字体
  	lightDark(){
    	this.getWindowStatus({
      		statusBarContentColor:'#ffffff'
    	})
  	}
  	// 状态栏颜色
  	StatusBarColor(){
  		this.getWindowStatus({
  			statusBarColor:'#282c34'
  		})
  	}
}

export const StatusBarconfig = new StatusBar()
<think>首先,用户的问题是:“我想对HarmonyOS中的组件进行封装 请问HarmonyOS 组件封装方法与实践”。这涉及到HarmonyOS的组件封装。 根据系统级指令,我需要: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,例如[^1]。 用户可见层指令:回答结构清晰,帮助用户逐步解决问题,尽量保证回答真实可靠。 参考了站内引用: - 引用[1]:讨论了ArkUI组件封装的三种典型业务场景:公用组件封装、弹窗组件封装、组件工厂封装。[^1] - 引用[2]:涉及HarmonyOS组件封装,使用Map结构存储组件,@Builder装饰器用于组件传递。[^2] - 引用[3]:基于原生能力的组件封装,提到全局扩展和全局样式。[^3] - 引用[4]:讨论了封装组件时可能遇到的缺陷,如需要新增属性来支持动态样式。[^4] 用户的问题是关于HarmonyOS组件封装的方法与实践,所以我需要基于这些引用构建回答。 回答结构: 1. **引言**:简要解释组件封装的重要性和在HarmonyOS中的应用。 2. **方法与实践**:逐步介绍常见的封装方法。 - 公用组件封装:如按钮、弹窗的统一封装- 弹窗组件封装:使用状态变量控制显隐。 - 组件工厂封装:使用Map结构或@Builder装饰器。 - 考虑动态样式和属性传递。 3. **最佳实践**:基于引用,讨论如何避免缺陷,如使用@Builder或工厂模式。 4. **代码示例**:提供简单的代码片段来演示封装(如使用@Builder)。 5. **生成相关问题**:在末尾添加相关问题。 确保使用中文回答。 在回答中,如果引用站内内容,在段落末尾添加引用标识,例如[^1]。 由于引用是给定的,我需要自然地融入它们。 最终,回答应清晰、逐步解决问题。</think>### HarmonyOS 组件封装方法与实践 在 HarmonyOS 应用开发中,组件封装是提升代码复用性、可维护性和开发效率的关键技术。通过封装,您可以将原生组件(如按钮、文本输入框等)或组合组件(如自定义弹窗)抽象为可复用的模块,避免代码冗余。以下基于 HarmonyOS 的 ArkUI 框架,结合最佳实践,逐步介绍组件封装的方法与实践。本回答参考了实际开发案例和官方文档,确保真实可靠[^1][^2]。 #### 1. **组件封装的核心方法** HarmonyOS 提供了多种封装方式,适用于不同场景: - **公用组件封装**:针对系统组件的统一封装,例如创建符合 UX 规范的按钮或弹窗组件。这常用于团队协作中,确保所有业务模块使用一致的样式。例如,封装一个登录按钮时,您可以定义统一的颜色、尺寸和点击事件。开发流程包括: - 定义组件(如 `CustomButton`)。 - 在组件内部使用系统组件(如 `Button`),并添加自定义属性。 - 通过 `@Prop` 或 `@State` 装饰器接收外部传入的参数(如按钮文本)。 - 优势:减少重复代码,提升一致性[^1][^3]。 - **弹窗组件封装**:用于封装带控制逻辑的弹窗,例如确认对话框。核心是使用状态变量管理弹窗的显隐。方法包括: -封装组件中定义 `@State` 变量控制弹窗显示(如 `isVisible`)。 - 调用方通过绑定该变量来操作弹窗(如 `showDialog()` 方法)。 - 示例:封装一个弹窗组件,内部包含标题、内容和关闭按钮,调用方只需传入状态即可控制[^1][^2]。 - **组件工厂封装**:适用于需要动态生成不同组件的场景,例如根据参数返回不同 UI 元素。这里推荐使用 Map 结构存储组件型,或利用 `@Builder` 装饰器传递组件函数: - 使用 Map 结构:定义一个工厂,将组件注册到 Map 中(key 为组件标识符,value 为组件实例),调用方通过 key 获取组件。 - 使用 `@Builder` 装饰器:装饰一个函数来构建组件,然后通过函数参数传递。这避免了在调用方 build 函数中使用复杂条件语句(如多个 if-else),使代码更简洁[^2][^4]。 - 优势:支持灵活扩展,适合复杂 UI 组合。 #### 2. **实践步骤与代码示例** 以下以封装一个自定义工具栏(Toolbar)组件为例,演示完整流程。该组件支持动态标题和样式,并处理属性传递问题。 **步骤 1: 定义封装组件** 使用 ArkUI 的自定义组件语法。在 `Toolbar.ets` 文件中: ```typescript @Component struct Toolbar { // 接收外部参数:标题文本和对齐方式 @Prop title: string = '默认标题'; @Prop align: TextAlign = TextAlign.Center; // 动态样式属性 build() { Row() { Text(this.title) .fontSize(20) .fontWeight(FontWeight.Bold) .textAlign(this.align) // 应用动态样式 Button('操作') .onClick(() => { // 处理点击事件 }) } .padding(10) .backgroundColor(Color.White) } } ``` **说明**: - 使用 `@Prop` 装饰器接收外部传入的属性(如 `title` 和 `align`),实现动态样式。 - 内部组合了 `Text` 和 `Button` 系统组件,避免直接暴露原生细节[^3][^4]。 **步骤 2: 在调用方使用封装组件** 在页面文件中导入并使用 `Toolbar`: ```typescript import { Toolbar } from './Toolbar' @Entry @Component struct HomePage { @State customTitle: string = '首页工具栏'; @State alignStyle: TextAlign = TextAlign.Start; // 动态修改对齐方式 build() { Column() { // 使用封装组件,传入动态参数 Toolbar({ title: this.customTitle, align: this.alignStyle }) // 其他内容... } } } ``` **说明**: - 调用方通过属性绑定控制组件的样式和行为,无需关心内部实现。 - 如果需要支持更多动态属性(如字体粗细),只需在 `Toolbar` 组件中添加对应的 `@Prop` 属性即可[^4]。 **步骤 3: 高级封装——使用 @Builder 工厂模式** 当组件需要高度灵活时(如根据型返回不同 UI),采用工厂模式: ```typescript // 定义工厂 class ComponentFactory { static getComponent(type: string): void | (() => void) { const componentMap: Map<string, () => void> = new Map(); componentMap.set('button', this.buildButton); componentMap.set('text', this.buildText); return componentMap.get(type); } @Builder static buildButton() { Button('工厂按钮').width(100); } @Builder static buildText() { Text('工厂文本').fontSize(16); } } // 调用方使用 @Entry @Component struct FactoryPage { @State compType: string = 'button'; build() { Column() { // 通过工厂获取组件 ComponentFactory.getComponent(this.compType)?.() } } } ``` **说明**: - 使用 `@Builder` 装饰器定义组件函数,并通过 Map 结构管理,避免在 build 函数中写条件逻辑。 - 优势:简化调用方代码,支持动态切换组件型[^2][^4]。 #### 3. **最佳实践与注意事项** - **动态样式处理**:封装组合式组件时,如果每个子组件有特有属性(如标题对齐、字体粗细),应在封装组件中定义对应的 `@Prop` 属性来接收外部参数。避免过度封装导致属性爆炸——优先传递常用属性,其余可通过事件回调处理[^4]。 - **性能优化**:减少不必要的状态更新(使用 `@State` 谨慎),并利用 HarmonyOS 的组件复用机制。 - **测试与维护**:为封装组件编写单元测试,确保在不同参数下行为正确。参考案例中,公用组件封装常用于登录按钮等高频元素[^1][^3]。 - **常见陷阱**:直接修改原生组件属性可能导致封装失效。建议始终通过装饰器(如 `@Prop`)进行数据传递[^4]。 通过以上方法,您可以高效封装 HarmonyOS 组件,提升开发效率。如果遇到具体场景(如弹窗控制),可进一步调整状态管理策略[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值