HarmonyOS 鸿蒙Next中cangjie开发调用自定义Component组件的回调函数在Index中报错
HarmonyOS 鸿蒙Next中cangjie开发调用自定义Component组件的回调函数在Index中报错
@Component
public class PanelComponent {
@State var outSetValue: Float32 = 0.0
@State var title: String = ''
@State var min: Float64 = 0.0
@State var max: Float64 = 0.0
@State var step: Float64 = 0.0
private var timer : Option<Timer> = None
public func callback(value:Float64, mode: SliderChangeMode){};
public func build(){
Column(){
Text(this.title)
.width(Constants.PANEL_WIDTH)
.padding( left: Constants.TITLE_PADDING )
.fontSize(Constants.FONT_SIZE)
.fontWeight(FontWeight.Medium)
.fontColor(@r(app.color.font_color))
.margin( left: Constants.TITLE_MARGIN_HORIZONTAL,
right: Constants.TITLE_MARGIN_HORIZONTAL )
Column() {
Slider(min:this.min, max: this.max, step:this.step, style: SliderStyle.InSet)
.layoutWeight(Constants.LAYOUT_WEIGHT)
.selectedColor(Constants.SLIDER_SKIN)
.onChange({value: Float64, mode: SliderChangeMode =>
this.callback(value, mode)
})
.margin( left: Constants.SLIDER_MARGIN_HORIZONTAL,
right: Constants.SLIDER_MARGIN_HORIZONTAL )
func build() {
Column() {
Image(@rawfile("windmill.png"))
.objectFit(ImageFit.Contain)
.width(Constants.IMAGE_SIZE)
.height(Constants.IMAGE_SIZE)
.rotate(
x: RotatePosition.X,
y: RotatePosition.Y,
z: RotatePosition.Z,
angle: this.angle,
)
.scale(x:this.imageSize, y:this.imageSize)
Row().height(Constants.WEIGHT_BLANK_IMAGE)
PanelComponent(title:"速度", min:SliderSpeed.MIN, max:SliderSpeed.MAX, step: SliderSpeed.STEP).callback(value,mode){
this.timer?.cancel()
this.timer = Timer.repeat(Duration.millisecond*100, Duration.millisecond*100, { =>
spawn(Main){this.angle += Float32(value) } })
}
报错macro evaluation has failed for macro call ‘Component’,应该如何调整?
更多关于HarmonyOS 鸿蒙Next中cangjie开发调用自定义Component组件的回调函数在Index中报错的实战教程也可以访问 https://www.itying.com/category-93-b0.html
尝试如下修改
@Component
public class PanelComponent {
@Prop title: string = ''
@Prop min: number = 0
@Prop max: number = 0
@Prop step: number = 0
@Prop onChange?: (value: number, mode: SliderChangeMode) => void // 声明回调属性
build() {
Column() {
Slider({ min: this.min, max: this.max, step: this.step })
.onChange((value: number, mode: SliderChangeMode) => {
this.onChange?.(value, mode) // 触发父组件回调
})
}
}
}
build() {
PanelComponent({
title: "速度",
min: SliderSpeed.MIN,
max: SliderSpeed.MAX,
step: SliderSpeed.STEP,
onChange: (value: number, mode: SliderChangeMode) => {
this.timer?.cancel()
this.timer = Timer.repeat(Duration.millisecond*100, () => {
spawn(Main) { this.angle += Float32(value) }
})
}
})
}
更多关于HarmonyOS 鸿蒙Next中cangjie开发调用自定义Component组件的回调函数在Index中报错的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
这是仓颉语法么
鸿蒙仓颉语法
以下为修改处,不再报错,多了一个timer变量,callback()定义及调用修改。
@State var outSetValue: Float32 = 0.0
@State var min: Float64 = 0.0
@State var max: Float64 = 0.0
@State var step: Float64 = 0.0
private var callback:(value:Float64, mode: SliderChangeMode)-> Unit;
PanelComponent(mode:SliderMode.SPEED, title:@r(app.string.speed_text), outSetValue:this.angle, min:SliderSpeed.MIN, max:SliderSpeed.MAX, step: SliderSpeed.STEP,
callback:({value,mode =>
this.timer?.cancel()
this.timer = Timer.repeat(Duration.millisecond*100, Duration.millisecond*100, { =>
spawn(Main){this.angle += Float32(value) } })}))
在HarmonyOS鸿蒙Next中,Cangjie开发调用自定义Component组件的回调函数在Index中报错,通常是由于组件未正确定义或回调函数签名不匹配导致。检查组件声明中是否使用@Component装饰器,确保回调参数类型与调用处一致。若使用@Builder或自定义构建函数,需确认函数作用域及参数传递正确性。
在PanelComponent中,回调函数callback需要定义为@ExternalFunction装饰器,并确保在调用时传递正确的参数类型。当前代码中callback在PanelComponent内部声明但未正确暴露给外部使用,导致Index中调用时报错。
调整方案:
- 在PanelComponent中,将callback声明为@ExternalFunction:
[@ExternalFunction](/user/ExternalFunction)
public callback?: (value: Float64, mode: SliderChangeMode) => void
- 在Index调用时,确保传递匹配的函数签名:
PanelComponent(
title: "速度",
min: SliderSpeed.MIN,
max: SliderSpeed.MAX,
step: SliderSpeed.STEP
)
.callback((value: Float64, mode: SliderChangeMode) => {
// 处理逻辑
})
这样调整后,回调函数能够正确绑定,避免macro evaluation错误。