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
把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已经改变,但组件可能还未完全渲染完成。以下是解决方案:
- 使用setTimeout是正确思路,但需要确保延迟足够长(建议至少300ms):
setTimeout(() => {
try {
this.getUIContext().getFocusController().requestFocus('PosTextInputId')
} catch(e) {
console.error(e)
}
}, 300)
- 更好的做法是监听组件显示完成事件:
TextInput({
//...
})
.onAppear(() => {
if(this.isEdit) {
this.getUIContext().getFocusController().requestFocus('PosTextInputId')
}
})
- 对于嵌套组件的情况,可以结合状态管理:
@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表示组件尚未准备好接收焦点,确保在组件完全渲染后再请求焦点即可解决。