HarmonyOS 鸿蒙Next 动态控制Toggle无效,无法更新最新展示状态

发布于 1周前 作者 phonegap100 来自 鸿蒙OS

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无效、无法更新最新展示状态的问题,这通常与组件的状态监听和刷新机制有关。以下是一些可能的原因及解决方案:

  1. 状态监听问题:确保您已经正确监听了Toggle组件的状态变化事件,并在事件回调中更新了相应的状态变量。
  2. UI刷新问题:在状态变量更新后,UI可能不会自动刷新。此时,您可以尝试手动触发UI刷新,或者使用@State装饰器来确保状态变量的变化能够自动触发UI更新。
  3. 组件属性设置:检查Toggle组件的属性设置,确保没有设置任何可能阻止状态更新的属性。
  4. 代码逻辑错误:仔细检查与Toggle组件相关的代码逻辑,确保没有逻辑错误导致状态更新失败。

如果上述方法均无法解决问题,可能是系统或组件的bug。此时,您可以尝试更新HarmonyOS系统或相关组件的版本,或者联系开发者社区寻求帮助。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部