HarmonyOS 鸿蒙Next ArkTs api8 开发踩坑记录及解决方案

HarmonyOS 鸿蒙Next ArkTs api8 开发踩坑记录及解决方案 最近是接了一个项目,用ArkTs写一个app。这是我用ArkTs写的第一个项目,当中踩了很多坑也发现了各种问题,在完成以后决定写一个帖子来分享一下。

一、为什么不选Stage模型
Stage和FA的区别到底是什么呢,简单点理解就是Stage模型适合分布式,但问题在于,Stage太新了导致文档都不全,我一开始选择的是api9+Stage模型,然后发现我连开启http的那段代码怎么添加到配置文件中都不知道,找遍了文档只有fa模型的……于是果断新建了一个项目,改成了api8+FA模型,所以,如果你对于分布式这种没有太多追求的话,还是求稳比较好

二、文件上传问题
这个是我遇到的最头疼的问题,这里有六个坑

  1. 不要相信官方demo,官方demo中是有一个明显错误的,那就是header是json格式而demo中是string格式,所以运行的时候会报错

  2. 官方文档里提到:
    要上传的文件列表。请使用 multipart/form-data提交

所以看到这个的第一反应就是在header里要加上content-type,但是一看官方文档中的示例代码也没有加,实际上这个是无所谓的

  1. 鸿蒙这里文件上传,data和file都是数组格式,即多文件上传,没有单文件上传的方案,后端接口这里要根据情况进行修改的

  2. 目前实测后端php是用不了的,java和python都可以正常,php无论用哪种接受请求的方法,都拿不到任何请求参数,就更不用提上传图片了,那么如果服务器是php环境的咋办呢,我最后的方案是花钱请大佬搞了个中间件解决的

  3. 在文档和官方demo中,你会发现上传的文件路径都是internal的,然而你通过媒体库或者其他方式选择文件以后……居然格式都是dataability的,然后通过检索文档,又会发现arkts并没有接口可以进行两种格式的转换……实际上两种格式都可以进行上传

  4. 拿不到后端返回的数据,文件上传是否成功只能通过比较“文件大小”和“上传大小”这两个数据

三、网络请求后回调问题
通过http或者request接口,这两个涉及到网络的接口,在完成操作调用回调函数时(包括使用promise方案),如果涉及到prompt、router这两个(其他的没试过),会报错,提示can not get delegate.,举个例子,比如说在完成登录以后,想进行一个“登录成功”的提示,并跳转到首页,你会发现是无法完成的,这是一个bug不是坑了。对此目前的解决办法是,在发起请求后,搞一个定时器,0.5秒后去判断从接口中返回的数据后,再去执行对应操作,即假定0.5秒内,已经完成了网络请求。这是一种人工添加异步的操作……

四、轻量级存储在应用刚打开的时候无法获取数据
第一个页面,在onpageshow或者abouttoapear时,我想去通过getsync获取数据,判断用户是否登录过,但是很遗憾,虽然getsync是一种同步的方式,按理说是能获取到的,但是实测无法获取,有两种解决方案,要么是在这里加一个定时器,比如0.1秒后再执行参数获取,或者我目前就是干脆全部用promise套了一层,全写成异步的,也可以成功。

五、textinput和textarea的焦点问题
如果在一个页面中,有两个或以上的输入表单,当你两个都点了一下以后,你会发现每一个上面都有蓝色的光标在跳动,即两个都似乎获得了焦点,这个问题目前我不知道解决方法

六、文件选择问题
当你需要上传一张图片的时候,你可以调用mediaLibrary.getMediaLibrary().startMediaSelect这个接口,然而,这个接口目前无法区分你选择的是图片还是视频,事实上,这一点官方在文档里也是承认的,type只能填media,又因为返回的是dataability的格式,没有文件后缀……

七、页面级状态变量
我整理了一下几个原则:

  1. 如果这个变量,是一个固定的数据,或者说变化不会引起任何ui渲染的,那么可以在export外面定义一个var……

  2. 如果这个变量,仅在本组件内有效,而且变化以后会引起ui重新渲染,即绑定在ui上的,那么用@State

  3. 如果这个变量,要传递给子组件,且子组件内,这个变量改变了以后,对父组件没影响的,那么父子都用@State

  4. 如果这个变量,要传递给子组件,且子组件内,这个变量改变了以后,也要同时去刷新父组件的ui的,那么父组件里用@State,子组件用@Link,但是父传子的时候要写成$变量名

  5. 如果你觉得写类型麻烦,就直接用any

八、屏幕属性的单位问题
有这样一个需求,就是把一个元素固定在屏幕右上角,那么有两种方法,一种是x设置为100%,然后设置元素的markAnchor,还有一种方案呢,就是获取屏幕的宽度,减掉元素宽度作为x,但是要注意的是,通过display拿到的宽度,单位是px,不是默认的基准单位vp

我觉得目前鸿蒙对我们这样普通开发者来说,最大的问题有两个:

  1. 每个版本的api,不管是8啊9的,都上的太急了,没有经过完善的测试就发布了

  2. 文档这块写的不够详细,并且感觉有多个版本一样,需要统一一下

任何一个新事物的发展都需要过程,但我觉得,鸿蒙得加快脚步了,我已经把手机电脑都换成华为的以表支持了


更多关于HarmonyOS 鸿蒙Next ArkTs api8 开发踩坑记录及解决方案的实战教程也可以访问 https://www.itying.com/category-93-b0.html

12 回复

开启http的那段配置stage模型是不需要的,只有fa需要

更多关于HarmonyOS 鸿蒙Next ArkTs api8 开发踩坑记录及解决方案的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


搞了几个月,卡、慢、崩就忍了,但这个乱没法忍,怎一个乱字了得。

我说补充一下:

1、组件通信:搞一大堆,什么单向的双向的,父子的后代的,简单类型的复杂类型的,@State@Prop@Link@Provide@Consume@Observed、ObjectLink……满天飞。其实,父子之间之间可单双向通信,除此之外的跨组件通信属于应用和业务层面的,用户自选方案,框架完全可以不予考虑即可。

2、组件事件:就目前而言仅支持 onClick(),就这么一个显式的方法,显然不够用的。改变组件内部状态的因素很多,比如请求完成、父组件事件引发、准备就绪、甚至拖放等等都不支持。

仅就上面两点来说,若组件是个函数,那Prop相当于入参,onClick 相当于返回。对于编程语言来说连函数的入参返回都这么蹩脚,足以显示ArkTs的语言设计相当儿戏和混乱。

非常认同你的第三第五点问题,也是困扰我很久的问题了,现在看至今1年了问题还是没有得到官方的解决

有要学HarmonyOS AI的同学吗,联系我:https://www.itying.com/goods-1206.html

文档和demo请保持更新啊,难不成神仙打架忘了更新啦,体谅下凡间疾苦吧各位神仙😄

补充
九、id问题
我发现在页面中,如果我想在父组件里创建一个变量,取名为id的话,是不允许的,一定要换个名字

感谢楼主

这个鸿蒙文档继续这么搞,就是往劝退文档发展的。想要吸引更多的用户,不仅仅是新技术,开发文档必须是完善的。文档都弄得模糊不清,示例也是不完整的,怎么可能有开发者愿意参与进来。很多简单的API设计使用上往往复杂化。鸿蒙想要发展还有很长的路要走。

对的,这个文档让我感觉一言难尽……

我想学,教程都是几分钟的,学个鬼。

api使用上我觉得还好,主要是官方文档的一些demo和api所述的功能的不全(也许是我的使用方式不正确),但目前很难找到有反馈相同问题并解决了的案例。所以学习进度很缓慢,

针对“HarmonyOS 鸿蒙Next ArkTs api8 开发踩坑记录及解决方案”的帖子标题,以下是一些可能的回答,专注于ArkTs及鸿蒙系统的相关问题:

在HarmonyOS鸿蒙Next的ArkTs api8开发中,开发者可能会遇到一些常见的坑。以下是一些踩坑记录及对应的解决方案:

  1. 组件渲染异常

    • 问题描述:组件在某些情况下无法正常渲染。
    • 解决方案:检查组件的属性和样式是否正确设置,确保没有遗漏或错误的属性。同时,验证父组件的布局和状态管理是否正确。
  2. 数据绑定问题

    • 问题描述:数据更新后,界面未能及时刷新。
    • 解决方案:确保使用了正确的数据绑定语法,并检查数据源的更新逻辑是否正确。此外,可以尝试使用强制刷新或状态重置的方法。
  3. 生命周期管理混乱

    • 问题描述:组件的生命周期方法被错误调用或未调用。
    • 解决方案:仔细检查组件的生命周期管理逻辑,确保在正确的时机调用相应的方法。同时,避免在生命周期方法中执行耗时操作。
  4. 性能优化问题

    • 问题描述:应用运行缓慢或出现卡顿。
    • 解决方案:优化组件的渲染逻辑,减少不必要的重绘和重排。同时,合理使用异步操作和懒加载技术来提高性能。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部