HarmonyOS 鸿蒙Next 多个WrappedBuilder切换不起作用

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

HarmonyOS 鸿蒙Next 多个WrappedBuilder切换不起作用

@Builder
function test1(){
  Text("test1")
}
@Builder
function  test2(){
  Text("test2")
}
@Builder
function test3(){
  Text("test3")
}
@Component
struct TestComponent {
  @State tests : WrappedBuilder<[]>[] = [
    wrapBuilder(test1),
    wrapBuilder(test2),
    wrapBuilder(test3),
  ]
  @State testIndex:number = 0;
  build() {
    Column(){
      this.tests[this.testIndex].builder()
      Text("点击我切换")
        .onClick(()=>{
          if ((this.testIndex + 1) >= this.tests.length) {
            this.testIndex = 0;
          }else {
            this.testIndex ++;
          }
          console.log(`TestComponent testIndex:${this.testIndex}`)
        })
    }
  }
}
5 回复

估计是状态变量的变化并不能驱动WrappedBuilder函数更新UI

我用foreach结合if,经测试后可以实现你要的功能

[@State](/user/State) index: number = 0
  [@State](/user/State) b: WrappedBuilder<[]>[] = [wrapBuilder(tBuilder1), wrapBuilder(tBuilder2), wrapBuilder(tBuilder3)]
  build() {
    Column() {
      ForEach(this.b, (item: WrappedBuilder<[]>, index: number) => {
        if (this.index === index) {
          item.builder()
        }
      })
      Button("切换").onClick(() => {
        this.index++;
        // ...
      })<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

哎 没有可以切换的容器,先这样搞

使用以下形式也不行

[@Builder](/user/Builder)
function test1(){
  Text("test1")
}
[@Builder](/user/Builder)
function  test2(){
  Text("test2")
}
[@Builder](/user/Builder)
function test3(){
  Text("test3")
}
[@Component](/user/Component)
struct TestComponent {
  [@State](/user/State) tests : WrappedBuilder<[]>[] = [
    wrapBuilder(test1),
    wrapBuilder(test2),
    wrapBuilder(test3),
  ]
  [@State](/user/State) testIndex:number = 0;
  build() {
    Column(){
      this.tests[this.testIndex].builder()
      TestComponent1({test:this.tests[this.testIndex]})
      Text("点击我切换")
        .onClick(()=>{
          if ((this.testIndex + 1) >= this.tests.length) {
            this.testIndex = 0;
          }else {
            this.testIndex ++;
          }
          console.log(`TestComponent testIndex:${this.testIndex}`)
        })
    }
  }
}

@Component struct TestComponent1 { @State test : WrappedBuilder<[]> | undefined = undefined build() { if (this.test!= undefined){ this.test.builder() } } }<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

不能通过if判断是因为数组的设定是长度未知

针对您提到的HarmonyOS鸿蒙Next系统中多个WrappedBuilder切换不起作用的问题,这可能是由于以下几个原因导致的:

  1. 状态管理问题:确保每个WrappedBuilder都正确地管理了自身的状态,并且在切换时能够正确地触发状态更新。检查状态变量是否在切换时被正确修改和响应。

  2. 组件生命周期:确认组件在切换时是否正确地经历了生命周期的变化,特别是onInit、onDispose等方法的调用情况,确保组件能够正确初始化和销毁。

  3. UI渲染问题:有时UI渲染可能由于系统或框架的bug而未能及时更新。尝试强制刷新UI或检查是否有相关的系统更新或补丁。

  4. 依赖注入问题:如果使用了依赖注入框架,确保依赖在切换时能够被正确解析和注入。

  5. 日志与调试:增加日志输出,特别是在状态切换和UI更新相关的代码段,以便追踪问题发生的具体位置。

如果以上检查均未能解决问题,可能涉及到更底层的框架或系统问题。此时,建议直接联系官方客服进行进一步排查。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部