HarmonyOS 鸿蒙Next @ohos.window窗口监听到键盘弹出时为什么会重新走一遍aboutToAppear()

HarmonyOS 鸿蒙Next @ohos.window窗口监听到键盘弹出时为什么会重新走一遍aboutToAppear() 点击TextInput()组件, 弹出键盘时, screenHeight的值被刷新了, 但是监听键盘弹出的方法写在了aboutToAppear()中, 为什么键盘弹出的时候,会重新走到aboutToAppear中。

还有一个问题: 这个 try catch 写在什么场景下,作用是什么? 是因为返回的是Promise, 所以使用try catch吗 使用async await 可以吗 ,但是如下代码的.getLastWindow和.on返回的是void是空呀

import window from '[@ohos](/user/ohos).window';

@Entry
@Component
struct entry {
  @State screenHeight: number = 0;

  aboutToAppear() {
    try {
      window.getLastWindow(getContext(), (err, data) => {
        if (err.code) {
          console.info('tip', '获取顶部窗口错误' + JSON.stringify(err));
          return;
        }

        let property = data.getWindowProperties(); // 获取当前窗口属性
        this.screenHeight = px2vp(property.windowRect.height); // 初始化高度

        try {
          data.on('keyboardHeightChange', (data) => {
            console.info('tip', '成功监听到键盘高度变化. Data: ' + px2vp(data)); // 303.66 单位vp
            this.screenHeight = px2vp(property.windowRect.height - data); // 可视化区域高度减去键盘高度
          });
        } catch (exception) {
          console.info('tip', '监听键盘高度变化失败. Cause: ' + JSON.stringify(exception));
        }
      });
    } catch (exception) {
      console.info('tip', '获取顶部窗口错误' + JSON.stringify(exception));
    }
  }

  build() {
    Column() {
      TextInput({ placeholder: '显示键盘的时候,我在上面的可视区域,我也是居中的' })
    }.width('100%').height(this.screenHeight).justifyContent(FlexAlign.Center)
  }
}

更多关于HarmonyOS 鸿蒙Next @ohos.window窗口监听到键盘弹出时为什么会重新走一遍aboutToAppear()的实战教程也可以访问 https://www.itying.com/category-93-b0.html

12 回复

正常获取!

回答你的问题:

1、为什么键盘弹出的时候,会重新走到aboutToAppear中

因为你aboutToAppear是监听keyboardHeightChange的事件,只要高度变化了 就会触发。刚进入页面 键盘高度为0 点击之后有了高度 就会触发这个事件,就会重新赋值。

2、try catch 写在什么场景下,作用是什么?

用来捕获异常错误

3、使用async await 可以吗

可以

更多关于HarmonyOS 鸿蒙Next @ohos.window窗口监听到键盘弹出时为什么会重新走一遍aboutToAppear()的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


但是还是有一个疑问就是aboutToAppear的生命周期,不是在执行build函数之前就执行过了吗,为什么还会监听到keyboardHeightChange事件, aboutToAppear中的内容不是只执行一次的嘛,

还有一个问题! 哥,再打扰你一下, 你这个log为什么只输出一遍呀, 我在评论区放个图片,你看一下,我的log,

图片

关于监听操作的一些说明:

  • aboutToAppear 开始执行监听操作,但这个监听操作只会执行一次。
  • 监听键盘高度改变的行为会一直存在。

能理解吗?

你们是next版本的吗

DevEco Studio目前最后的一个版本,在组件内用不了,只能在组件外使用,有没有大佬帮忙看下的

你们的DevEco Studio的版本是多少啊

为什么,我使用window引入以后,在

@Component 创建的组件里面用不了

只能在

@Component 组件外部使用

我没用4.0的,还是3.1,
我用再abouttoappear中的,,

有要学HarmonyOS AI的同学吗,联系我:https://www.itying.com/goods-1206.html

有时候是两次 有时候是一次 我也没搞懂是为啥

交给玄学吧~,

为什么每次打开键盘和关闭键盘的时候,这个log会输出两次

在HarmonyOS(鸿蒙)中,aboutToAppear() 是 Ability 或 Page 的生命周期回调方法之一,通常用于在页面即将显示时进行初始化操作。当键盘弹出时,系统可能会触发页面布局的重新调整,导致页面重新走一遍生命周期回调,包括 aboutToAppear()

具体原因如下:

  1. 布局变化:键盘弹出会导致页面布局发生变化,系统需要重新计算和调整页面内容的位置。这种布局变化可能会触发页面的重新渲染,从而导致 aboutToAppear() 被再次调用。

  2. 生命周期管理:HarmonyOS 在页面布局发生重大变化时,为了确保页面状态的一致性,可能会重新触发页面的生命周期回调。aboutToAppear() 作为页面即将显示时的回调方法,会被重新调用以进行必要的初始化操作。

  3. 系统优化:在某些情况下,系统可能会认为键盘弹出后页面的显示状态发生了变化,因此会重新调用 aboutToAppear() 以确保页面的正确显示和功能。

这种行为是系统设计的一部分,旨在确保在布局变化时页面的状态和显示内容保持一致。开发者需要在 aboutToAppear() 中处理好初始化的逻辑,避免因多次调用导致的不必要操作或资源浪费。

回到顶部