1、HarmonyOS ForEach 和lazyForEach 中的 item是引用还是全新拷贝的对象?
ForEach 和lazyForEach 中的 item是引用还是全新拷贝的对象
咨询场景描述:
LazyForEach(this.treeData as MyDataSource, (item: TreeNode) => {
TreeItem({treeNode:item,option:this.option, callback:() => {
console.log('asdfasdfasdf')
}})
ForEach中的item
在ForEach中,item是一个常量,每次迭代时都是全新的拷贝对象。这意味着对于每次迭代,item都是一个独立的副本,其内存储的状态和数据不会影响到其他迭代。
LazyForEach中的item
在LazyForEach中,item是通过键值生成器生成的唯一且固定的键值。每个数据项生成一个键值,用于标识对应的组件。当数据项的键值变化时,ArkUI框架会视为该数组元素已被替换或修改,并会基于新的键值创建一个新的组件。因此,item在LazyForEach中是引用传递的,其状态和数据可以在迭代过程中被观测到。
由于ForEach中的item是全新拷贝的对象,每次迭代都会创建一个新的副本,因此在处理大型数据集时,会导致内存消耗较大,可能会出现性能问题。而在LazyForEach中,item是通过引用传递的,这意味着数据项在迭代过程中不会被重新创建,从而减少了内存消耗和性能开销。
ForEach适用于需要独立、互不影响的数据副本的场景,而LazyForEach适用于需要高效引用传递和组件复用的场景。
2、HarmonyOS 如何获取页面的NavigationInfo对象?
参考:developer.huawei.com/consumer/cn…
自定义组件内置方法是由ArkUI开发框架提供给应用开发者的,定义在自定义组件基类上的API。应用开发者可以在自定义组件的实例上调用对应的API以获取当前自定义组件实例相关的信息。例如,查询当前自定义组件上下文的UIContext信息。
queryNavigationInfo(): NavigationInfo | undefined 查询自定义组件所属的Navigation信息。
3、HarmonyOS 组件能否暴露方法给上层调用?
组件能否暴露方法给上层调用 父组件调用子组件方法,参考demo:
@Component
struct Child {
@State private text: string = '初始值'
private controller: ChildController = new ChildController();
aboutToAppear() {
if(this.controller) {
this.controller.changeText = this.changeText
}
console.log('aaa')
}
private changeText = (value: string) =>{
this.text = value
console.log('bbb')
}
build() {
Column() {
Text(this.text)
}
}
}
class ChildController {
changeText = (value: string) => {
console.log('11111')
}
}
export let ChildRef = new ChildController()
@Entry
@Component
struct Parent {
// ChildRef = new ChildController()
@State noShow: boolean = false
build() {
Column() {
Text('获取Child的exposeMethods!').fontSize('18vp').fontColor(Color.Gray)
Divider()
Child({ controller: ChildRef })
Child()
Button('Parent调用childer的changeText').onClick(() => {
ChildRef.changeText('Parent调用childer的changeText')
})
}
}
}
4、HarmonyOS nav路由pop某个page实例之后,这个page实例声明和创建的局部实例变量却还存在?
nav路由pop某个page实例之后,这个page实例声明和创建的局部实例变量却还存在
1、通过路由跳转到FlutterPageIndex这个page,里面声明了一个:flutterEntry实例。 2、在其他地方通过nav路由pop到其他页面(上面的FlutterPageIndex关闭) 3、但是经过一段时间后,里面的callbackTheme被调用时,this.flutterEntry?.refreshTheme()还会被执行。this.flutterEntry没有被销毁。
**解决方案:**pop只是弹出路由栈栈顶元素,并触发onPop回调传入页面处理结果,并不会销毁中间的栈。请使用popToIndex或者popToName
5、HarmonyOS 状态栏的颜色如何修改?
状态栏的颜色如何修改
要修改状态栏的颜色,可以使用setWindowSystemBarProperties方法。该方法允许你设置状态栏的背景颜色、透明度、高亮图标等属性。以下是具体步骤:
- 在你的EntryAbility.ets文件中,使用onWindowStageCreate方法。
- 在该方法中,调用setWindowSystemBarProperties方法。
- 通过该方法,你可以设置状态栏的背景颜色、透明度等属性。例如,要设置状态栏的背景颜色为白色,可以执行以下操作:
plaintextsetWindowSystemBarProperties({
backgroundColor:'#FFFFFF'});
通过这种方式,你可以自定义状态栏的颜色和其他属性,以满足不同的UI需求。
##鸿蒙核心技术##鸿蒙开发工具##Arkcompiler# ##社交##