HarmonyOS 鸿蒙Next @BuilderParam尾随闭包情况下@Provide未定义错误

发布于 1周前 作者 bupafengyu 最后一次编辑是 5天前 来自 鸿蒙OS

HarmonyOS 鸿蒙Next @BuilderParam尾随闭包情况下@Provide未定义错误
文档里面写的错误示例,解释没有理解,并且也不知道正确的写法。

@Provide装饰器和@Consume装饰器:与后代组件双向同步-管理组件拥有的状态-状态管理(V1稳定版)-状态管理-学习ArkTS语言-基础入门 | 华为开发者联盟 (huawei.com)

@BuilderParam尾随闭包情况下@Provide未定义错误

在此场景下,CustomWidget执行this.builder()创建子组件CustomWidgetChild时,this指向的是HomePage。因此找不到CustomWidget的@Provide变量,所以下面示例会报找不到@Provide错误,和@BuilderParam连用的时候要谨慎this的指向。

错误示例:

class Tmp {
  a: string = ''
}

@Entry
@Component
struct HomePage {
  @Builder
  builder2($$: Tmp) {
    Text(`${$$.a}测试`)
  }

  build() {
    Column() {
      CustomWidget() {
        CustomWidgetChild({ builder: this.builder2 })
      }
    }
  }
}

@Component
struct CustomWidget {
  [@Provide](/user/Provide)('a') a: string = 'abc';
  [@BuilderParam](/user/BuilderParam)
  builder: () => void;

  build() {
    Column() {
      Button('你好').onClick((x) => {
        if (this.a == 'ddd') {
          this.a = 'abc';
        }
        else {
          this.a = 'ddd';
        }

      })
      this.builder()
    }
  }
}

@Component
struct CustomWidgetChild {
  [@Consume](/user/Consume)('a') a: string;
  [@BuilderParam](/user/BuilderParam)
  builder: ($$: Tmp) => void;

  build() {
    Column() {
      this.builder({ a: this.a })
    }
  }
}
7 回复
楼主您好,试下换成用bind试试。

期待HarmonyOS能在未来带来更多创新的技术和理念。

Arkts不推荐使用bind()吧。我觉得现在鸿蒙应该少了一个指定this的功能,类似Android里面this@这样的功能; 所以这种做法现在基本不能用。

好像也用不了bind,ide提示不支持

this确实很容易出错

在HarmonyOS鸿蒙开发中,遇到@BuilderParam尾随闭包情况下@Provide未定义错误,通常是由于构建器模式与依赖注入框架(如Hiview DFX等)之间的兼容性问题或代码书写错误导致。

首先,确认@BuilderParam@Provide的使用场景与文档描述一致。@BuilderParam通常用于构建器模式中的参数定义,而@Provide则用于依赖注入。两者在逻辑上并不直接关联,但可能在同一上下文中使用。

  1. 检查注解导入:确保@BuilderParam@Provide均正确导入自官方或正确的第三方库。
  2. 检查构建器实现:确认构建器类是否按预期实现,且参数传递无误。
  3. 依赖注入配置:确保依赖注入框架已正确配置,且@Provide注解的使用符合框架要求。
  4. 编译器与IDE:确保开发环境(如IDE和编译器)为最新版本,以避免因版本不兼容导致的错误。

如果上述步骤均无误,但问题依旧存在,可能是更深层次的系统或框架问题。此时,建议直接联系官网客服,以便获得更专业的技术支持。官网地址是:https://www.itying.com/category-93-b0.html

回到顶部