背景:
最近在使用ets写一个应用程序的时候,有一个需求会使用到索引器,我首先没有官方是否有该组件,如果有则直接拿过来,则使用自己自定义的组件。
然后翻阅了官方api文档,发现有Alphabetindexer组件可以使用,然后运行官方demo,各种编译和运行报错,然后先解决然后编译报错,运行报错,最后结果运行无效果。最后解决就是放弃该组件,想着自定义的一个组件又来了,在自定义的时候又发现了一个组件,而现在又自定义了,而无法自定义,自定义我出来的组件又发生了这样的事情,我仍然不满意。好好研究下为什么这个官方组件为什么运行不了而官方又确实有运行成功的效果图。后来我会重新回到内部使用IDE和sdk,跟手上的不同,就像HarmonyOS的sdk7还没有出来的时候,是先推出OpenHarmony的s7的,然后我新建了一个OpenHarmony的项目来跑案例,结果成功运行了。终于能跑起来了,那为什么HarmonyOS上就支持跑起来看不到呢? 预览器和运行不正常。
AlphabetIndexer组件演示代码和运行效果
@Entry
@Component
struct AlphabetIndexerComponent {
private value: string[] = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
build() {
AlphabetIndexer({ ArrayValue: this.value, selected: 0 })
.selectedColor(0xffffff) // 选中颜色
.popupColor(0xFFFAF0) // 弹出框颜色
.selectedBackgroundColor(0xCCCCCC) // 选中背景颜色
.popupBackground(0xD2B48C) // 弹出框背景颜色
.usingPopup(true) // 是否显示弹出框
.selectedFont({ size: 16, weight: FontWeight.Bolder }) // 选中的样式
.popupFont({ size: 30, weight: FontWeight.Bolder }) // 弹出框的演示
.itemSize(28) // 每一项的大小正方形
.alignStyle(IndexerAlign.Left) // 左对齐
.onSelected((index: number) => {
console.info(this.value[index] + '被选中了') // 选中的事件
})
.margin({ left: 50 })
}
}
错误分析
这里主要的想法就是拿不正常的HarmonyOS工程和正常的OpenHarmony工程做比对。
上面的demo好之后,在HarmonyOS中编译时一直报错,IDE会直接在代码中飘红,截图如下:
遇到问题,我们自己首先的肯定是查看函数的定义,修改去让通过编译
。
时候会发现就是一个转换一个大小写不匹配的小问题,然后我自然会将演示中的代码的参数ArrayValue改成arrayValue,此时编译就不会报错了。然后使用预览器运行的话会直接崩溃,如下图
没有预览错误的日志,使用运行报告,查看日志如下图
之前一直在怀疑是写演示的问题,后面创建了OpenHarmony
工程执行相同的代码,ok 对比下 OpenHarmony 的 sdk 中的 AlphabetIndexer 的组件如下图:
这个问题是我发现的这个问题。此时可以确认我的问题是这个参数的问题。
那么如何呢?
解决代码问题,修改HarmonyOS Sdk中的
修改SDK目录下的组件目录下的alphabet_indexer.d.ts文件
该是数组文件中的
,通过使 IDE修改文件中的值才
可以找到原因,但是仍然无法编译。下面继续,追寻下ets如何参与编译的。 -loader这个文件夹。
修改SDK目录代码下的build-toolsets-loaderdeclarations下的alphabet_indexer.d.ts
你文件中的arrayValue修改为ArrayValue
上面两步修改之后,就可以正常在HarmomyOS上运行起来该案例了。
总结
自从我发现今天突然发现了一个非常确定的原因,实际解决过程不是我想用艰辛的时候,我突然发现了某个问题。我写过一篇如何打开Harmony源码来编译的文章,即使我编译也不能直接提供给HarmonyOS执行使用了。直接通过修改本地的sdk文件解决下,最终找到了上面的解决方法解决。
|