HarmonyOS 鸿蒙Next 动态控制Toggle无效,无法更新最新展示状态
HarmonyOS 鸿蒙Next 动态控制Toggle无效,无法更新最新展示状态
Toggle状态默认打开true, 点击开关,弹出是否关闭选项,
如果选择“解除”则状态改为关闭false组件Toggle变成关闭状态
,如果选中“取消”则依旧保持打开状态true组件Toggle保持选中打开状态
2 回复
参考下这个demo,isOn该参数支持$$双向绑定变量,会触发组件的刷新。
[@CustomDialog](/user/CustomDialog)
[@Component](/user/Component)
struct privacyDialog {
controller?: CustomDialogController
// 若尝试在CustomDialog中传入多个其他的Controller,以实现在CustomDialog中打开另一个或另一些CustomDialog,那么此处需要将指向自己的controller放在所有controller的后面
cancel: () => void = () => {
}
confirm: () => void = () => {
}
build() {
Column() {
Text('若解除授权将不能使用,请您确认是否要解除?')
.padding({top:16,bottom:16})
.fontSize(14)
.lineHeight(20)
.width('100%')
Text('解除')
.width('100%')
.textAlign(TextAlign.Center)
.padding({top:16,bottom:16})
.fontColor('#EC4C5D')
.fontSize(15)
.border({
width:{top:1},
color:'#E4E4E4'
})
.onClick(()=>{
this.confirm()
})
Text('取消')
.width('100%')
.textAlign(TextAlign.Center)
.padding({top:16,bottom:16})
.fontSize(15)
.border({
width:{top:1},
color:'#E4E4E4'
})
.onClick(()=>{
this.cancel()
})
}
.width('100%')
.padding({top:16,left:12,right:12,bottom:16})
// 如果需要使用border属性或cornerRadius属性,请和borderRadius属性一起使用。
}
}
[@Observed](/user/Observed)
class Item {
status:boolean;
protocolName:string;
protocolNum:string;
id:number;
constructor(status: boolean,protocolName:string,protocolNum:string,id:number) {
this.status = status;
this.protocolName = protocolName;
this.protocolNum = protocolNum;
this.id = id;
}
}
[@Component](/user/Component)
struct ToggleComponent{
[@ObjectLink](/user/ObjectLink) item: Item;
dialogController: CustomDialogController | null = new CustomDialogController({
builder: privacyDialog({
cancel: ()=> { this.onCancel() },
confirm: ()=> { this.onAccept() }
}),
autoCancel: true,
alignment: DialogAlignment.Bottom,
offset: { dx: 0, dy: 20 },
customStyle: false,
cornerRadius: 10,
width:'100%',
})
// 在自定义组件即将析构销毁时将dialogController置空
aboutToDisappear() {
this.dialogController = null // 将dialogController置空
}
onCancel() {
// 选中取消
console.info('Callback when the first button is clicked')
this.dialogController?.close();
// 点击取消时需要通过索引在数组中找到该数据将状态改为true
this.item.status = true
}
onAccept() {
// 选中解除
console.info('Callback when the second button is clicked')
this.dialogController?.close();
// 点击解除时需要通过索引在数组中找到该数据将状态改为false
this.item.status = false
}
build() {
Flex({ alignItems: ItemAlign.Center }){
Text(this.item.protocolName +'=='+this.item.status)
.width('100%')
.textAlign(TextAlign.Start)
.fontSize(20)
.margin({top:20})
Toggle({ type: ToggleType.Switch, isOn:$$this.item.status })
.width(52)
.height(24)
.onChange((isOn: boolean) => {
console.info('Component status:' + isOn)
if(!isOn){
// 如果状态改为关闭false,则拿到索引,根据判断是否解除和取消来改变所对应的内容状态改变
this.dialogController?.open();
}
})
}
}
}
[@Entry](/user/Entry)
[@Component](/user/Component)
struct demo {
[@State](/user/State) textValue: string = ''
[@State](/user/State) inputValue: string = 'click me'
[@State](/user/State) dataList:Array<Item> = [ new Item( true,'状态1','1',1),new Item( true,'状态2','2',2)]
build(){
Column(){
Text('需求:状态默认打开true, 点击开关,弹出是否关闭选项,如果选择“解除”则状态改为关闭false组件Toggle变成关闭状态,如果选中“取消”则依旧保持打开状态true组件Toggle保持选中打开状态')
.width('100%')
Text('问题:点击开关选中取消时,Toggle组件的状态没有根据绑定的 isOn 状态改变,好像定义的isOn没有对Toggle组件生效')
.margin({top:10})
.width('100%')
ForEach(this.dataList,(item:Item,index)=>{
ToggleComponent({item:item})
})
}
}
}
针对HarmonyOS鸿蒙Next中动态控制Toggle无效、无法更新最新展示状态的问题,这通常与组件的状态监听和刷新机制有关。以下是一些可能的原因及解决方案:
- 状态监听问题:确保您已经正确监听了Toggle组件的状态变化事件,并在事件回调中更新了相应的状态变量。
- UI刷新问题:在状态变量更新后,UI可能不会自动刷新。此时,您可以尝试手动触发UI刷新,或者使用@State装饰器来确保状态变量的变化能够自动触发UI更新。
- 组件属性设置:检查Toggle组件的属性设置,确保没有设置任何可能阻止状态更新的属性。
- 代码逻辑错误:仔细检查与Toggle组件相关的代码逻辑,确保没有逻辑错误导致状态更新失败。
如果上述方法均无法解决问题,可能是系统或组件的bug。此时,您可以尝试更新HarmonyOS系统或相关组件的版本,或者联系开发者社区寻求帮助。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。