“答开发者问”之HarmonyOS技术问题解析第1期(上)

科技   2024-11-27 18:03   广东  
# 答开发者问 #

【答开发者问】栏目为开发者呈现鸿蒙官方技术支持团队针对部分开发者在开发过程中遇到的问题,给出的官方答复,助力开发者扫清鸿蒙开发路上的障碍,后续会继续为大家更新最新问题和最新官方回复内容!

本期文章为大家选取了2个常见开发问题及官方回复内容,希望能为大家带来新的思考~




Q

如何导入其他module的so库?

详细描述:

项目里有多个模块,在其中一个公共模块,创建了cpp目录,放入了c++代码,并配置好了index.d.ts、cmake、napi等信息,在本模块界面中通过import libxx from 'libxx.so'可以正常调用C++函数。但是在其他模块中,用这样的导入方式IDE会报错,如图所示,应该如何正确导入?


解决方案:

跨模块使用so库可以用以下方法:

1.纯CPP部分单独用ndk编译成.so或.a并放在HAR或HSP中。

2.依赖上述的HAR或HSP后,使用已链接+头文件的方式,在链接的时候,直接写库文件的名字即可,这样纯cpp的so实现了多模块共享。需要通过napi使用的也只需要单独写napi代码即可,此时napi封装后的能力也可以通过模块依赖的方式被其他模块使用。

操作步骤:

1.在HAR/HSP模块的build-profile.json5中buildOption/nativeLib/headerPath指定接口文件目录

buildOption: { nativeLib: { headerPath: "src/main/cpp/include" } }

2.调用方依赖HAR/HSP包

// oh-package.json dependencies: { curl: "1.0.0" }

3.调用方配置cmake链接so,格式为packageName::soName
target_link_libraries(entry PUBLIC curl::curl)

参考文档🔗:https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs-V5/faqs-ndk-72-V5
原链接🔗:https://developer.huawei.com/consumer/cn/forum/topic/0203162064009643100?fid=0109140870620153026&pid=0302162158973362670

Q

使用@Builder数据刷新后UI没有刷新,导致图片错乱怎么解决?

问题描述:

如下代码,直接使用 @Builder itemBuild 会导致图片错乱,直接写Image 就正常。如果我还是想用 @Builder itemBuild,怎么让复用也正常呢?
@Reusable@Componentstruct ReusableFlowItem {  @State item: number = 0  @Prop fontSize: number = 12
// 从复用缓存中加入到组件树之前调用,可在此处更新组件的状态变量以展示正确的内容 aboutToReuse(params: Record<string, number>) { this.item = params.item; console.info('Reuse item:' + this.item) }
aboutToAppear() { console.info('item:' + this.item) }
@Builder itemBuild(icon: string, item: number) { Image($r(icon)) .objectFit(ImageFit.Fill) .geometryTransition('geometryTransition'+icon ) .sharedTransition('sharedImage' + icon + item, {duration: 300 }); }
build() { Column() { // 直接使用 itemBuild 会有复用错乱问题 // this.itemBuild(getIcon(this.item), this.item) Image($r(getIcon(this.item))) .objectFit(ImageFit.Fill) .geometryTransition('geometryTransition'+getIcon(this.item) ) .sharedTransition('sharedImage' + getIcon(this.item) + this.item, {duration: 300 }); Text(getContent(this.item)).fontSize(this.fontSize).maxLines(3).textOverflow({overflow: TextOverflow.Ellipsis}) } .alignItems(HorizontalAlign.Start) }}
解决方案:
定义构建函数(@Builder)默认的按值参数传递方式不支持动态改变组件,当传递的参数为状态变量时,状态变量的改变不会引起@Builder方法内的UI刷新,要实现UI动态刷新需要按引用传递参数。

可以参考官方文档中@Builder和@Component的区别🔗:https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs-V5/faqs-arkts-8-V5

有两种解决方法:

①按引用传递参数

class Tmp {  icon: string = ''  item: number = 0}
@BuilderitemBuild($$: Tmp) { Image($r($$.icon)) .objectFit(ImageFit.Fill) .geometryTransition('geometryTransition'+$$.icon ) .sharedTransition('sharedImage' + $$.icon + $$.item, {duration: 300 });}
this.itemBuild({icon: getIcon(this.item), item: this.item})
② 不用@builder,改为使用自定义组件@Component也可以实现需求
原链接🔗:https://developer.huawei.com/consumer/cn/forum/topicview?tid=0201164980153582686&fid=0109140870620153026
本文转载自华为开发者联盟-HarmonyOS NEXT 问答版块,原文链接请点击文末阅读原文。
更多推荐
点击下方图片链接,查看更多栏目内容





HarmonyOS开发者技术
HarmonyOS开发者提供HarmonyOS关键技术解析、版本更新、Codelabs实践和活动资讯,欢迎各位开发者加入鸿蒙生态,一起创造无限可能!
 最新文章