写点什么

【每日学点 HarmonyOS Next 知识】路由栈问题、图片圆角、颜色资源转十六进制字符串、数据集变化崩溃、组件声明周期

作者:轻口味
  • 2025-03-15
    北京
  • 本文字数:2175 字

    阅读完需:约 7 分钟

【每日学点HarmonyOS Next知识】路由栈问题、图片圆角、颜色资源转十六进制字符串、数据集变化崩溃、组件声明周期

1、HarmonyOS app 退到后台再进入,Navigation 就会退到栈底并重新渲染?

可能原因在使用 Navigation 做路由时,当应用退到后台再进入 Navigation 时,页面会退到栈底并重新渲染,这是因为 Navigation 组件默认情况下会隐藏导航栏,只有在栈顶元素被弹出时才会重新显示导航栏问题原因


  1. 导航栏隐藏:Navigation 组件默认会隐藏导航栏,只有在栈顶元素被弹出时才会重新显示导航栏。这意味着当应用退到后台时,导航栏会被隐藏,再次进入时需要重新显示导航栏,从而导致页面重新渲染

  2. 栈管理:当应用退到后台时,当前页面的状态会被保存在路由栈中,再次进入时会从栈底开始恢复页面状态,这也会导致页面重新渲染


解决方法


  1. 设置 hideTitleBar 为 false:可以在 Navigation 组件中设置 hideTitleBar 属性为 false,以避免导航栏在应用退到后台时被隐藏。具体设置方法如下: - 在 Navigation 组件中,将 hideTitleBar 属性设置为 true。 - 或者使用 NavDestination 组件时,将 hideTitleBar 属性设置为 true。

  2. 使用 pushDestinationByName 方法:可以使用 pushDestinationByName 方法将当前页面推入栈中,并确保页面在栈顶,从而避免页面重新渲染。具体方法如下:


使用 pushDestinationByName 方法将当前页面推入栈中,确保页面在栈顶。确保在页面出栈时使用 onPop 回调处理返回结果,以避免页面重新渲染。通过以上方法,可以有效避免应用退到后台再进入 Navigation 时页面重新渲染的问题。

2、HarmonyOS 在使用 borderimage 的前提下,如何设置圆角?

参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-universal-attributes-border-image-V5


borderImage(value: BorderImageOption)设置组件的图片边框。


通过 borderImage 接口为组件设置渐变色边框示例:


// xxx.ets@Entry@Componentstruct Index {  build() {    Row() {      Column() {        Text('This is gradient color.').textAlign(TextAlign.Center).height(50).width(200)          .borderImage({            source: {              angle: 90,              direction: GradientDirection.Left,              colors: [[0xAEE1E1, 0.0], [0xD3E0DC, 0.3], [0xFCD1D1, 1.0]]            },            slice: { top: 10, bottom: 10, left: 10, right: 10 },            width: { top: "10px", bottom: "10px", left: "10px", right: "10px" },            repeat: RepeatMode.Stretch,            fill: false          })      }      .width('100%')    }    .height('100%')  }}
复制代码

3、HarmonyOS ResourceColor 转 16 进制 string?

能提供个 ResourceColor 转 16 进制 string 方法吗?通过 resourceManager 中的 getColorSync 获得对应颜色的十进制数,再转 16 进制参考 demo:


let resource: resourceManager.Resource = {  bundleName: "com.example.helloworld",  moduleName: "entry",  id: $r('app.color.start_window_background').id};let colorNumber = this.context.resourceManager.getColorSync(resource);let colorString = colorNumber.toString(16)console.log(colorString);
复制代码


参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-resource-manager-V5#getcolorsync10


getColorSync(resId: number) : number;


用户获取指定资源 ID 对应的颜色值,使用同步方式返回。

4、HarmonyOS IDataSource 的 onDatasetChange()崩溃?

IDataSource 的 onDatasetChange()崩溃Error message:onDatasetChange cannot be used with other interface


在使用 LazyForEach 组件时,如果尝试使用 onDatasetChange 方法进行数据集的批量修改操作,会出现错误消息 onDatasetChange cannot be used with other interface。这是因为 onDatasetChange 方法不能与其他操作数据的接口混用。原因解释:


1、onDatasetChange 方法用于通知 LazyForEach 组件进行批量的数据处理。该方法接受一个包含多个数据操作的数组作为参数。这些操作可以包括数据的添加、删除、移动等。当你尝试在 onDatasetChange 中传入包含删除操作的数据集时,系统会认为这是一个不兼容的操作,从而导致崩溃。这是因为 onDatasetChange 方法不支持与其他操作数据的接口混用。


使用其他方法:


1、避免在 onDatasetChange 中包含删除操作。你可以将删除操作单独进行,然后使用 onDataDelete 方法通知 LazyForEach 组件删除数据。


2、分开进行操作:如果需要同时进行添加、删除、移动等操作,可以将这些操作分别进行,而不是混在一起使用 onDatasetChange 方法。例如,先调用 onDataAdd、onDataDelete 和 onDataMove 方法,然后再调用 onDataReloaded 方法进行刷新。通过以上方法,可以避免 onDatasetChange 方法的崩溃问题,确保 LazyForEach 组件能够正确处理数据的变化。

5、HarmonyOS 在页面实际显示时做一些事,比如组件显示时就播放,隐藏就暂停?

onPageShow 页面每次显示触发。onPageHide 页面每次隐藏触发。参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-custom-component-lifecycle-V5


自定义组件的生命周期回调函数用于通知用户该自定义组件的生命周期,这些回调函数是私有的,在运行时由开发框架在特定的时间进行调用,不能从应用程序中手动调用这些回调函数。不要在多个窗口复用同一个自定义组件节点,其生命周期可能会紊乱。


发布于: 刚刚阅读数: 3
用户头像

轻口味

关注

🏆2021年InfoQ写作平台-签约作者 🏆 2017-10-17 加入

Android、音视频、AI相关领域从业者。 欢迎加我微信wodekouwei拉您进InfoQ音视频沟通群 邮箱:qingkouwei@gmail.com

评论

发布
暂无评论
【每日学点HarmonyOS Next知识】路由栈问题、图片圆角、颜色资源转十六进制字符串、数据集变化崩溃、组件声明周期_HarmonyOS_轻口味_InfoQ写作社区