HarmonyOS鸿蒙Next中在设置了动态visibility属性后,使用getUIContext().getFocusController().requestFocus('id')会报错,无法获取焦点

HarmonyOS鸿蒙Next中在设置了动态visibility属性后,使用getUIContext().getFocusController().requestFocus(‘id’)会报错,无法获取焦点

@Entry @ComponentV2 struct Index { @Local message: string = ‘Hello World’; @Local textInputController: TextInputController = new TextInputController(); @Local isEdit: boolean = false;

build() { Column() {

  Column() {
    Button(this.isEdit ? '看效果' : '去编辑').onClick(() => {
      this.isEdit = !this.isEdit
      if(this.isEdit){
        setTimeout(() => {
          try {
            this.getUIContext().getFocusController().requestFocus('PosTextInputId')
          } catch (e){
            console.error(e)
          }

        }, 1)

      }
    })
    Text(this.message)
      .id('HelloWorld')
      .fontSize($r('app.float.page_text_font_size'))
      .fontWeight(FontWeight.Bold)
      .alignRules({
        center: { anchor: '__container__', align: VerticalAlign.Center },
        middle: { anchor: '__container__', align: HorizontalAlign.Center }
      })
      .onClick(() => {
        this.message = 'Welcome';
      })
  }.visibility(!this.isEdit ? Visibility.Visible : Visibility.None)

  Column() {
    Button(this.isEdit ? '看效果' : '去编辑').onClick(() => {
      this.isEdit = !this.isEdit
      if(this.isEdit){
        setTimeout(() => {
          this.getUIContext().getFocusController().requestFocus('PosTextInputId')
        }, 1)

      }
    })
    TextInput({
      text: $$this.message,
      placeholder: '请输入',
      controller: this.textInputController
    })
      .id('PosTextInputId')
      .enterKeyType(EnterKeyType.Search)
      .padding(0)
      .fontSize(13)
      .placeholderColor($r('app.color.ff999999'))
      .placeholderFont({
        size: 13
      })
      .layoutWeight(1)

  }.visibility(this.isEdit ? Visibility.Visible : Visibility.None)


}
.height('100%')
.width('100%')

} }

示例代码如上,不设置setTimeout,为 100 毫秒,就会报错,在项目里面作为嵌套组件,在切换的时候不论设置多少秒都会报错。报错信息都是 150003,但是页面的组件已经显示出来,我进行点击可以获取焦点,请问如何写才可以准确去主动获焦点


更多关于HarmonyOS鸿蒙Next中在设置了动态visibility属性后,使用getUIContext().getFocusController().requestFocus('id')会报错,无法获取焦点的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

把Visibility.None改成Visibility.Hidden试一试?

更多关于HarmonyOS鸿蒙Next中在设置了动态visibility属性后,使用getUIContext().getFocusController().requestFocus('id')会报错,无法获取焦点的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,当设置了动态visibility属性后,使用getUIContext().getFocusController().requestFocus('id')可能会因为组件尚未完成布局或渲染而报错。确保在组件可见后调用该函数,或使用postTask延迟执行焦点请求,确保组件已完成布局。

在HarmonyOS Next中,动态切换visibility后立即请求焦点确实会出现问题。这是因为UI更新是异步的,虽然visibility已经改变,但组件可能还未完全渲染完成。以下是解决方案:

  1. 使用setTimeout是正确思路,但需要确保延迟足够长(建议至少300ms):
setTimeout(() => {
  try {
    this.getUIContext().getFocusController().requestFocus('PosTextInputId')
  } catch(e) {
    console.error(e)
  }
}, 300)
  1. 更好的做法是监听组件显示完成事件:
TextInput({
  //...
})
.onAppear(() => {
  if(this.isEdit) {
    this.getUIContext().getFocusController().requestFocus('PosTextInputId')
  }
})
  1. 对于嵌套组件的情况,可以结合状态管理:
@Local readyForFocus: boolean = false

// 在父组件中
Column()
  .visibility(this.isEdit ? Visibility.Visible : Visibility.None)
  .onAppear(() => {
    this.readyForFocus = true
  })

// 在子组件中
TextInput()
  .onAppear(() => {
    if(this.readyForFocus) {
      this.getUIContext().getFocusController().requestFocus('PosTextInputId')
    }
  })

错误码150003表示组件尚未准备好接收焦点,确保在组件完全渲染后再请求焦点即可解决。

回到顶部