【每日学点鸿蒙知识】指纹识别隐藏背面、数组内部值变化刷新UI、键盘输入类型、跨组件路由、C++20特性支持
1、HarmonyOS 指纹识别情况下,隐藏背面内容?
有一个场景,在指纹识别验证页面时候,此时需要用户看不到背面的内容,请问应该怎么处理这块。或者有什么方案,可以通过window,获取到当前页面的page,这样可以显示一个遮挡view.
自定义弹窗 (CustomDialog)中,maskColor跟maskRect可以进行遮挡具体参考文档:
https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-methods-custom-dialog-box-V5#customdialogcontrolleroptions%E5%AF%B9%E8%B1%A1%E8%AF%B4%E6%98%8E
2、HarmonyOS @State修饰的数组内部的值变化了,怎么刷新UI?
pageDatas是一个@State修饰的复杂对象数组,当修改数组中的某个值时UI不会变化吗?是不是只有基本数据类型值改变时UI才会修改?如果是这样,应该怎么修改UI呢?
试过用DataSource的resetData也不行,首页用Swiper,获取网络数据后用resetData后是UI是有变化的,为什么这里不行?
要改变数组中对象的值需要用 @Observed和@ObjectLink。下面示例展示了数组对象的用法。
示例:
@Component
struct ViewA {
// 子组件ViewA的@ObjectLink的类型是ClassA
@ObjectLink a: ClassA;
label: string = 'ViewA1';
build() {
Row() {
Button(`ViewA [${this.label}] this.a.c = ${this.a.c} +1`)
.onClick(() => {
this.a.c += 1;
})
}
}
}
@Entry
@Component
struct ViewB {
// ViewB中有@State装饰的ClassA[]
@State arrA: ClassA[] = [new ClassA(0), new ClassA(0)];
build() {
Column() {
ForEach(this.arrA,
(item: ClassA) => {
ViewA({ label: `#${item.id}`, a: item })
},
(item: ClassA): string => item.id.toString()
)
// 使用@State装饰的数组的数组项初始化@ObjectLink,其中数组项是被@Observed装饰的ClassA的实例
ViewA({ label: `ViewA this.arrA[first]`, a: this.arrA[0] })
ViewA({ label: `ViewA this.arrA[last]`, a: this.arrA[this.arrA.length-1] })
Button(`ViewB: reset array`)
.onClick(() => {
this.arrA = [new ClassA(0), new ClassA(0)];
})
Button(`ViewB: push`)
.onClick(() => {
this.arrA.push(new ClassA(0))
})
Button(`ViewB: shift`)
.onClick(() => {
this.arrA.shift()
})
Button(`ViewB: chg item property in middle`)
.onClick(() => {
this.arrA[Math.floor(this.arrA.length / 2)].c = 10;
})
Button(`ViewB: chg item property in middle`)
.onClick(() => {
this.arrA[Math.floor(this.arrA.length / 2)] = new ClassA(11);
})
}
}
}
3、HarmonyOS 键盘InputType支持问题?
键盘输入类型不支持仅支持ASCII characters吗?
目前没有单独的键盘输入类型,可通过正则表达式设置输入过滤器(inputFilter),匹配表达式的输入允许显示,不匹配的输入将被过滤。仅支持单个字符匹配,不支持字符串匹配。参考链接如下:https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-arkui/arkui-ts/ts-basic-components-textinput.md#inputfilter8
4、HarmonyOS 关于router.pushNamedRoute还要引用对应的类这个问题?
场景是服务器下发name,然后我们进行跳转,实际上我们不知道他会跳转到哪个页面所以就要都import一遍能跳转的页面,导致代码冗余,或者能不能实现这些引用的类都写在一个类里面,然后在外部只需要引用这一个类就OK呢?
实现了一个全局路由工具类RouterUtil,它包含三种常用页面跳转类型:当前模块跳转,Har包页面跳转,Hsp包页面跳转。
样例代码如下:
import { router } from '@kit.ArkUI'
import { common } from '@kit.AbilityKit'
// 导入har包中的页面
import('library/Index');
class RouterUtil {
routerTo(pageName: string) {
switch (pageName) {
case "HarPage":
// 根据服务端下发的包名,确定需要跳转的har包页面
router.pushNamedRoute({
name: pageName
})
break
case "CurHapPage":
// 若为当前hap中的页面,可直接用pushUrl跳转
router.pushUrl({
url: `pages/${pageName}`
})
break
case "HspPage":
// 跳转对应Hsp页面
let context = getContext() as common.UIAbilityContext
router.pushUrl({
url: `@bundle:${context.applicationInfo.name}/feature/ets/pages/${pageName}`
})
break
default:
break
}
}
}
let hspRouterUtil = new RouterUtil()
export default hspRouterUtil as RouterUtil
// 使用处 pages/Index.ets
import HspRouterUtil from '../common/util/RouterUtil'
@Entry
@Component
struct Index {
build() {
Column() {
Text("router To HarPage")
.fontSize(50)
.margin({top: 20})
.onClick(() => {
HspRouterUtil.routerTo("HarPage")
})
Text("router To CurHapPage")
.fontSize(50)
.margin({top: 20})
.onClick(() => {
HspRouterUtil.routerTo("CurHapPage")
})
Text("router To HspPage")
.fontSize(50)
.margin({top: 20})
.onClick(() => {
HspRouterUtil.routerTo("HspPage")
})
}.width('100%').height('100%')
}
}
对于Har包中的页面,需要开发者在对应Har包的<harName>Index.ets
文件中注册需要导出的页面。
5、HarmonyOS HarmonyOS应用开发是否支持c++20?
clang目前版本是15.0.4,c++20部分支持,具体可参考:https://clang.llvm.org/cxx_status.html