HarmonyOS鸿蒙Next中NodeContainer的attributeModifier使用问题

HarmonyOS鸿蒙Next中NodeContainer的attributeModifier使用问题

export class NodeContainerAttributeModifier implements AttributeModifier<NodeContainerAttribute> {
    private model: Nullable<BaseModel> = undefined

    constructor(model: Nullable<BaseModel>) {
        this.model = model;
    }

    applyNormalAttribute(instance: NodeContainerAttribute): void {
        instance.position({ x: ProjectUtils.convertLeft(this.model), y: ProjectUtils.convertTop(this.model) })
            .width(ProjectUtils.convertWidth(this.model!))
            .height(ProjectUtils.convertHeight(this.model!))
            .zIndex(this.model!.zIndex)
            .clip(true)
            .visibility(StyleHelper.isShow(this.model!))
    }
}

使用代码:

NodeContainer(getNormalButton(item as NormalButtonModel, this.nodeTree, this.jsonController))
    .attributeModifier(new NodeContainerAttributeModifier(item))

使用attributeModifier(new NodeContainerAttributeModifier(item))运行会提示Type Error, 不使用这个属性就不会,item是继承于BaseModel的接口类。


更多关于HarmonyOS鸿蒙Next中NodeContainer的attributeModifier使用问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

开发者您好,请查看NodeContainer说明第四行,如您希望NodeContainer能够使用动态属性设置,请问您是在什么样的业务场景中使用该能力,交互流程是怎样的,在哪一个环节遇到了问题?方便说明能力不满足可能带来的影响:什么时间用到?是否高频?有无三方库可以做到?若提供该能力,是否会造成大工作量返工?请您注意提供的内容不要包含您或第三方的非公开信息,如给您带来不便,敬请谅解。

更多关于HarmonyOS鸿蒙Next中NodeContainer的attributeModifier使用问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


NodeContainer 说明

该组件下仅支持挂载自定义节点FrameNode或者是BuilderNode中获取的根节点FrameNode。

不支持挂载查询获得的系统组件代理节点。

当前不支持使用动态属性设置

该组件下的节点树构建时会使用UI实例UIContext,实例切换时可能会因实例不匹配,导致所绑定NodeControllermakeNode回调方法的入参为undefined,因此该组件当前不支持跨实例的节点复用。

该组件未销毁时,不会主动触发挂载节点的下树。

NodeContainer-自定义占位组件-ArkTS组件-ArkUI(方舟UI框架)

NodeContainer的attributeModifier用于在ArkTS中动态修改组件属性。它接收一个Attribute对象,通过回调函数更新节点样式或布局。使用时需在NodeContainer的构造参数或属性方法中设置。常见问题包括修改未生效,通常因状态更新未触发UI重建,需检查状态管理或使用@State装饰器。确保在UI线程执行属性修改。

在HarmonyOS Next中,NodeContainerattributeModifier方法期望接收一个实现了AttributeModifier<NodeContainerAttribute>接口的对象。根据你提供的代码,问题很可能出在类型匹配或BaseModel的可空性处理上。

你的NodeContainerAttributeModifier类定义是正确的。问题可能出现在调用处,item的类型可能被推断为更具体的子类型,导致与Nullable<BaseModel>构造函数参数类型不完全匹配。

解决方案:

  1. 确保构造函数参数类型兼容:在调用new NodeContainerAttributeModifier(item)时,确认item可以安全地赋值给Nullable<BaseModel>。如果itemBaseModel的子类实例,这通常是允许的。但需要检查是否有严格的编译期类型检查。

  2. 检查ProjectUtils方法:错误可能间接来自applyNormalAttribute方法内部的工具类调用。请确保ProjectUtils.convertWidth(this.model!)convertHeight等方法在this.modelundefinednull(即Nullable状态)时能正确处理,或者确保传入的item不为空。你代码中使用了非空断言操作符!,这在this.model可能为undefined时是危险的,会导致运行时错误。

  3. 显式类型声明:尝试在调用处明确类型,确保类型系统理解你的赋值是安全的:

    .attributeModifier(new NodeContainerAttributeModifier(item as BaseModel))
    

    或者,如果item可能为空,更严谨的写法是:

    .attributeModifier(new NodeContainerAttributeModifier(item ? (item as BaseModel) : undefined))
    
  4. 修正applyNormalAttribute中的空安全:建议修改applyNormalAttribute方法,增加空值判断,避免使用非空断言!

    applyNormalAttribute(instance: NodeContainerAttribute): void {
        if (!this.model) {
            // 如果model为空,可以选择设置默认属性或直接返回
            return;
        }
        instance.position({ x: ProjectUtils.convertLeft(this.model), y: ProjectUtils.convertTop(this.model) })
            .width(ProjectUtils.convertWidth(this.model))
            .height(ProjectUtils.convertHeight(this.model))
            .zIndex(this.model.zIndex)
            .clip(true)
            .visibility(StyleHelper.isShow(this.model))
    }
    

核心是确保从itemNullable<BaseModel>的类型转换是显式且安全的,并加强applyNormalAttribute方法内部的鲁棒性,处理model可能为空的情况。

回到顶部