HarmonyOS 鸿蒙Next中Stepper组件的bug有人遇到吗

HarmonyOS 鸿蒙Next中Stepper组件的bug有人遇到吗 通过$$双向绑定状态变量 index 索引,改变索引状态变量的值时可以跳转页面,但是不会触发 onChange 回调,手动点击上/下一页才能触发回调。已经反馈给官方了,但就算真的看到了,解决了,最快也得下个版本了,还要很久,你们遇到过这个问题吗,怎么解决。

5 回复

可以使用状态变量来监听类属性的变化

  1. 状态管理v1:默认可监听第一层的变化,加上@State、@Watch修饰即可,可参考文档:装饰class对象类型的变量@Watch装饰器:状态变量更改通知。可以参考如下代码的使用方式:
class Model {
  public value: string;

  constructor(value: string) {
    this.value = value;
  }
}

@Entry
@Component
struct MyComponent {
  @State @Watch('titleChange') title: Model = new Model('Hello World');


  titleChange() {
    console.info(`title change ${this.title.value}`)
  }
  build() {
    Column() {
      Text(`${this.title.value}`)
        .margin(10)
      Button(`Click to change title`)
        .onClick(() => {
          // @State变量的更新将触发上面的Text组件内容更新
          this.title.value = this.title.value === 'Hello ArkUI' ? 'Hello World' : 'Hello ArkUI';
        })
        .width(300)
        .margin(10)
    }
  }
}
  1. 如果使用状态管理V2,可使用@Trace/@Monitor

参考文档:[@ObservedV2装饰器和@Trace装饰器:类属性变化观测](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-new-observedv2-and-trace)、[@Monitor装饰器:状态变量修改监听](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-new-monitor)。可以参考如下代码的使用方式:

@ObservedV2
class Info {
  [@Trace](/user/Trace) name: string = "Tom";
  [@Trace](/user/Trace) region: string = "North";
  [@Trace](/user/Trace) job: string = "Teacher";
  age: number = 25;

  // name被[@Trace](/user/Trace)装饰,能够监听变化
  [@Monitor](/user/Monitor)("name")
  onNameChange(monitor: IMonitor) {
    console.info(`name change from ${monitor.value()?.before} to ${monitor.value()?.now}`);
  }

  // age未被[@Trace](/user/Trace)装饰,不能监听变化
  [@Monitor](/user/Monitor)("age")
  onAgeChange(monitor: IMonitor) {
    console.info(`age change from ${monitor.value()?.before} to ${monitor.value()?.now}`);
  }

  // region与job均被[@Trace](/user/Trace)装饰,能够监听变化
  [@Monitor](/user/Monitor)("region", "job")
  onChange(monitor: IMonitor) {
    monitor.dirty.forEach((path: string) => {
      console.info(`${path} change from ${monitor.value(path)?.before} to ${monitor.value(path)?.now}`);
    })
  }
}

@Entry
@ComponentV2
struct Index {
  info: Info = new Info();

  build() {
    Column() {
      Button("change name")
        .onClick(() => {
          this.info.name = "Jack"; // 能够触发onNameChange方法
        })
      Button("change age")
        .onClick(() => {
          this.info.age = 26; // 不能够触发onAgeChange方法
        })
      Button("change region")
        .onClick(() => {
          this.info.region = "South"; // 能够触发onChange方法
        })
      Button("change job")
        .onClick(() => {
          this.info.job = "Driver"; // 能够触发onChange方法
        })
    }
  }
}

更多关于HarmonyOS 鸿蒙Next中Stepper组件的bug有人遇到吗的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


Stepper?楼主说的是Swepper吗?

Stepper

在HarmonyOS Next中,Stepper组件存在已知数值绑定异常问题。部分开发者反馈点击增减按钮时界面数值未实时更新,需手动刷新才能同步。该问题在API Version 12的设备上复现率较高,具体表现为双向数据绑定失效。华为已将该问题纳入缺陷管理系统,预计下个SDK版本修复。临时解决方案可通过@State装饰器强制触发UI刷新。

是的,这个问题在HarmonyOS Next的Stepper组件中确实存在。当通过编程方式修改绑定的索引变量时,onChange回调不会被触发,只有用户手动点击切换时才会执行。

临时解决方案:

  1. 手动触发回调逻辑
    在修改索引值后,显式调用onChange中需要执行的逻辑:

    // 示例代码
    this.index = newIndex; // 修改索引
    this.handleStepChange(newIndex); // 手动调用原onChange逻辑
    
  2. 监听索引变量变化
    通过[@Watch](/user/Watch)装饰器监听索引变化,替代onChange

    [@Watch](/user/Watch)('index')
    onIndexChange(newValue: number) {
      // 执行原onChange逻辑
    }
    
  3. 封装Stepper组件
    自定义组件包装Stepper,内部同时处理索引绑定和事件触发,避免直接依赖onChange

根本原因:
Stepper组件的onChange目前仅响应UI交互事件,未与双向绑定的索引变量变更关联。这属于框架层的事件机制缺陷。

建议在官方修复前优先采用上述方案,同时保持对SDK更新的关注。若业务逻辑强依赖此回调,方案2([@Watch](/user/Watch))最稳定。

回到顶部