鸿蒙Next-AttributeModifier结合@Styles和@Extend深度解析使用

声明式语法引入了@Styles和@Extend两个装饰器,可以解决复用相同自定义样式的问题,但是存在以下受限场景:

一、概述 

声明式语法引入了@Styles@Extend两个装饰器,可以解决复用相同自定义样式的问题,但是存在以下受限场景:

  • @Styles和@Extend均是编译期处理,不支持跨文件的导出复用。
  • @Styles仅能支持通用属性、事件,不支持组件特有的属性。
  • @Styles虽然支持在多态样式下使用,但不支持传参,无法对外开放一些属性。
  • @Extend虽然能支持特定组件的私有属性、事件,但同样不支持跨文件导出复用。
  • @Styles、@Extend对于属性设置,无法支持业务逻辑编写,动态决定是否设置某些属性,只能通过三元表达式对所有可能设置的属性进行全量设置,设置大量属性时效率较低。

为了解决上述问题,ArkUI引入了AttributeModifier机制,可以通过Modifier对象动态修改属性。能力对比如下:

能力
@Styles
@Extend
AttributeModifier
跨文件导出
不支持
不支持
支持
通用属性设置
支持
支持
支持
通用事件设置
支持
支持
部分支持
组件特有属性设置
不支持
支持
部分支持
组件特有事件设置
不支持
支持
部分支持
参数传递
不支持
支持
支持
多态样式
支持
不支持
支持
业务逻辑
不支持
不支持
支持

可以看出,与@Styles和@Extend相比,AttributeModifier提供了更强的能力和灵活性,且在持续完善全量的属性和事件设置能力,因此推荐优先使用AttributeModifier。

二、接口定义













declare interface AttributeModifier<T> {//定义组件正常状态的属性值  applyNormalAttribute?(instance: T): void;//定义组件按下的属性,比如点击事件  applyPressedAttribute?(instance: T): void;//定义焦点相关的属性  applyFocusedAttribute?(instance: T): void;//定义组件禁用属性  applyDisabledAttribute?(instance: T): void;//定义选择属性  applySelectedAttribute?(instance: T): void;}

三、基础使用范式

  1. ‌1、跨文件样式复用
  2. // TextModifier.ets(独立文件)

    export class TextModifier implements AttributeModifier<TextAttribute{

        applyNormalAttribute(instance: TextAttribute): void {

            instance.width('100%')

                .fontSize(16)

                .fontColor(Color.Black)

                .margin({ top: 10 })

        }

    }

创建实现AttributeModifier<T>接口的样式类,支持全局导出复用,解决@Styles无法跨文件的问题‌
2‌、组件绑定样式
// 宿主组件

import { TextModifier } from './TextModifier'

@Entry

@Component

struct MyPage {

    @State textModifier: TextModifier = new TextModifier()



    build() {

        Column() {

            Text("鸿蒙Next核心特性")

                .attributeModifier(this.textModifier)

        }

    }

}


通过.attributeModifier()方法动态注入样式,支持状态感知‌35


四、多状态控制

  1. ‌1、五态样式覆盖

export class ButtonModifier implements AttributeModifier<ButtonAttribute{

    // 默认态

    applyNormalAttribute(instance: ButtonAttribute): void {

        instance.backgroundColor(Color.Blue)

    }    // 按压态

    applyPressedAttribute(instance: ButtonAttribute): void {

        instance.backgroundColor(Color.Green)

    }    // 禁用态

    applyDisabledAttribute(instance: ButtonAttribute): void {

        instance.backgroundColor(Color.Gray)

    }

}

实现不同交互状态的样式回调方法‌46

  1. 2‌、动态状态切换

@Component

struct DynamicButton {

    @State isActive: boolean = false

    @State modifier: ButtonModifier = new ButtonModifier()



    build() {

        Button('状态按钮')

            .attributeModifier(this.modifier)

            .onClick(() => {

                this.isActive = !this.isActive

                // 动态修改modifier属性

                this.modifier.applyNormalAttribute = (instance) => {

                    instance.backgroundColor(this.isActive ? Color.Red : Color.Blue)

                }

            })

    }

}

结合@State变量实现运行时样式更新‌36


五、高级场景应用

  1. ‌1、业务逻辑集成

  2. export class AuthButtonModifier implements AttributeModifier<ButtonAttribute{

        private isVIP: boolean = false



        setVIPStatus(status: boolean) 
    {

            this.isVIP = status

        }



        applyNormalAttribute(instance: ButtonAttribute): void {

            instance.backgroundColor(this.isVIP ? Color.Gold : Color.Gray)

                .fontColor(this.isVIP ? Color.Black : Color.White)

        }

    }

    在样式中嵌入条件判断,实现动态属性设置‌57


    1. 2‌、组件库开发

    2. // 企业规范库

      export class PrimaryButtonModifier implements AttributeModifier<ButtonAttribute{

          applyNormalAttribute(instance: ButtonAttribute): void {

              instance.width(240)

                  .height(48)

                  .borderRadius(24)

                  .fontSize(16)

                  .backgroundColor('#007AFF')

          }

      }


封装企业级UI规范,统一管理按钮/输入框等组件样式‌18


六、典型使用场景

场景类型
技术方案
优势体现
多主题切换
创建不同主题的Modifier类,运行时动态切换‌57
样式与逻辑解耦
A/B测试
通过工厂模式生成不同样式的Modifier实例‌36
动态部署无感知
无障碍适配
在Modifier中集成大字模式/高对比度样式‌48
状态感知自动化
组件库维护
将Modifier独立为har包,跨项目复用‌18
统一设计规范

注意事项

  1. ‌1、类型安全

    • 明确指定泛型类型AttributeModifier<T>中的T(如ButtonAttribute),避免属性设置错误‌68
  2. 2‌、性能优化

    • 避免在apply方法内进行耗时操作,复杂逻辑应前置处理‌35
  3. ‌3、兼容性

    • 需鸿蒙API Version 11+支持,低版本需降级方案‌12

代码验证示例

// 验证多态样式
let modifier = new ButtonModifier()
Button('智能按钮')
    .attributeModifier(modifier)
    .onTouch((event) => {
        if (event.type === TouchType.Down) {
            modifier.applyPressedAttribute(modifier)
        } else if (event.type === TouchType.Up) {
            modifier.applyNormalAttribute(modifier)
        }
    })

通过以上方案,开发者可构建高复用性、强可维护的鸿蒙Next UI体系。


来源:公众号 作者:Android技术之家 原文地址:https://mp.weixin.qq.com/s/FPBcnv-Hih9nxd5hUclSJg

来源: 互联网
本文观点不代表码客-全球程序员交流社区立场,不承担法律责任,文章及观点也不构成任何投资意见。

赞 ()

相关推荐

  • 置顶 开发项目接单群,免费入群了

    无论你是Android、ios、java、php,或者你是产品经理、老板,都可以免费入群接单或者发布项目,全程不收取任何费用。

    2025年02月21日 15点27分
  • 鸿蒙Next-AttributeModifier结合@Styles和@Extend深度解析使用

    声明式语法引入了@Styles和@Extend两个装饰器,可以解决复用相同自定义样式的问题,但是存在以下受限场景:

    2025年03月03日 15点40分
  • ConstraintLayout之layout_constraintDimensionRatio属性详解

    layout_constraintDimensionRatio 是 ConstraintLayout 提供的一个强大功能,它可以让 View 按照固定的宽高比例自适应尺寸。使用这个属性,可以在 ConstraintLayout 中根据已知的宽度或高度,自动计算另一个维度,确保 View 保持特定的宽高比。

    2025年03月03日 15点39分
  • Android事件分发时,你浓眉大眼的onTouch()竟然没有执行?

    在开发需求时,有这么一个场景:Activity中有一个ViewGroup作为Parent,ViewGroup里面又有一个Webview作为Child。当一进入页面时,系统输入法自动弹起,而在点击Parent区域时,需要收起系统输入法。背景介绍完毕,当时的第一想法就是通过Parent设置setOnTouchListener,然后在onTouch()回调中来实现:

    2025年03月02日 15点10分
  • Android SDK封装与发布实战指南

    Android SDK封装与发布实战指南

    2025年03月02日 15点05分
  • 鸿蒙Next开发-添加水印以及点击穿透设置

    在鸿蒙Next中,为App全局添加水印可以通过以下方式实现,其中通过窗口添加水印是一种常见且高效的方式。以下是具体方案和实现细节:

    2025年02月26日 23点15分
  • 鸿蒙Next开发-普通函数和箭头函数 this指向的区别以及对UI刷新的影响

    鸿蒙Next开发-普通函数和箭头函数 this指向的区别以及对UI刷新的影响

    2025年02月26日 23点14分
  • 深入探索ArkUI @Builder与@BuilderParam的进阶应用

    在ArkUI的组件化开发体系中,@Builder和@BuilderParam这对装饰器组合扮演着UI模块化的重要角色。二者的差异与配合体现了声明式UI的核心思想:

    2025年02月26日 23点12分
  • Deepseek推荐:Android 开发者需要掌握的系统知识大纲

    一、操作系统基础1. Linux 内核机制内容介绍 Android 基于 Linux 内核,核心机制包括进程管理、内存管理、文件系统、Binder 驱动等。

    2025年02月26日 23点09分
  • Android App 厂商角标适配

    本篇介绍一下笔者在维护IM应用时,设置App角标的相关经验。同时这里设置角标都是基于系统厂商的Launcher,没有适配三方的Launcher应用,因为我们统计下来发现近些年使用三方Launcher应用比较少了,大部分用户还是以系统Launcher为主。所在在我们的项目中,主要是适配各个厂商。

    2025年02月26日 23点07分
  • 鸿蒙Next-方法装饰器以及防抖方法注解实现

    以下是关于 鸿蒙Next(HarmonyOS NEXT)中 MethodDecorator 的详细介绍及使用指南,结合了多个技术来源的实践总结:

    2025年02月26日 22点58分
  • DevEco Studio常用快捷键以及如何跟AndroidStudio的保持同步

    DevEco Studio是华为推出的用于开发HarmonyOS应用的集成开发环境,它提供了丰富的快捷键以提高开发效率,以下为你详细介绍不同操作场景下的常用快捷键:

    2025年02月26日 22点56分
  • Android | 利用ItemDecoration绘制RecyclerView分割线

    RecyclerView.ItemDecoration 是 Android 提供的一种扩展机制,用于为 RecyclerView 的每个子项(Item)添加装饰(Decoration)。它通常用于绘制分割线、边距、背景等,目的是增强 RecyclerView 的显示效果。

    2025年02月26日 22点52分
  • Android 布局优化:利用 ViewStub 和 Merge 提升性能

    提升界面渲染性能是一个至关重要的任务,尤其是在应用启动时,渲染界面需要快速且流畅。为了优化 UI 渲染速度,Android 提供了许多工具,其中 ViewStub 和 Merge 标签是非常有效的布局优化手段。通过合理使用这两者,可以延迟加载不必要的视图、减少布局的嵌套层级,从而加速应用的启动和运行。

    2025年02月26日 22点47分
  • 玩转 ImageView.ScaleType:图片的缩放与裁剪技巧

    ImageView 是最常用的控件之一,它用于展示各种类型的图片。为了能够根据需求调整图片的显示效果,Android 提供了 ImageView.ScaleType 枚举,它可以灵活地控制图片如何适应 ImageView 的尺寸。本文将探讨 ImageView.ScaleType 的不同选项、使用场景及其实现技巧。

    2025年02月26日 22点45分
  • Android加快你的编译速度

    工欲善其事,必先利其器。如果每次运行项目都要花费5-10分钟,那人的心态都要崩了。

    2025年02月25日 15点40分

发表回复

评论列表

点击查看更多

    联系我们

    在线咨询: QQ交谈

    微信:dxmcpjl

    邮件:1529097251#qq.com

    工作时间:周一至周五,9:30-18:30,节假日休息

    微信