鸿蒙开发中遇到的问题

1.在使用系统的一些框架获取信息时,有的获取不到

(1)bundleManager 获取verson 信息

import { bundleManager } from '@kit.AbilityKit';

bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION).then((bundleInfo)=>{

  let versionName = bundleInfo.versionName;//App version name

  let versionNo = bundleInfo.versionCode;//App version code

}).catch((error: BusinessError )=>{

  console.error("get bundleInfo failed,error is "+error)

})

获取到的都是空字符,报错:

The getBundleInfoForSelf interface in the previewer is a mocked implementation and may behave differently than on a real device.

(2)获取随机的uuid

let uuid = util.generateRandomUUID(true);

console.info("RFC 4122 Version 4 UUID:" + uuid);

获取到的都是空字符,报错:

The generateRandomUUID interface in the previewer is a mocked implementation and may behave differently than on a real device.

2.定义Map,value值既有string类型,又有map类型

在ArkTs中我们需要明确具体的类型,不然会报错

let map = new Map<string,any>()

报错 Use explicit types instead of "any", "unknown" (arkts-no-any-unknown) <ArkTSCheck>

可以这样:

let map = new Map<string,string | Map<string,string>>()

这样value既可以是string 也可以是Map

3.在类方法中不可以使用类定义的属性

使用报错:

Using "this" inside stand-alone functions is not supported (arkts-no-standalone-this) <ArkTSCheck>

4.页面中像素大小

px   物理像素   精确像素级控制(慎用)1vp ≈ px / (DPI/160)

fp    字体像素   文字大小默认1fp=1vp,受系统字体缩放影响

lpx   视窗逻辑像素响应式布局(比例适配)与屏幕宽度和designWidth相关

%     百分比相对父容器尺寸无直接换算关系

vp的定义与特性

物理本质

vp 是与屏幕密度相关的虚拟像素单位,其换算公式为:

vp = px / (DPI / 160)

ArkUI中未指定单位的数值(如width: 220)默认单位为vp

5.编写过程中,如果通过ArkTs提供的方法在模拟器中获取信息获取不到,可以是TypeScript

比如获取随机数,使用

import { cryptoFramework } from '@kit.CryptoArchitectureKit';

async function generateSecureRandom() {

  // 1. 创建随机数实例

  let rand = cryptoFramework.createRandom();


  // 2. 启用硬件熵源(增强随机性)

  rand.enableHardwareEntropy();


  // 3. 可选:设置随机种子

  let seed = new Uint8Array([1, 2, 3]);

  rand.setSeed({ seed });


  // 4. 生成16字节随机数

  let randomData = await rand.generateRandom(16);

  console.log("Secure random:", randomData.data);

}

报错:

The generateRandom interface in the previewer is a mocked implementation and may behave differently than on a real device.

可以直接使用TypeScript方法:简单粗暴

getRandomInt(min: number, max: number): number {

  return Math.floor(Math.random() * (max - min + 1)) + min;

}

6.在ArkTs中不支持for - in 语法

遍历数组 → for...of

let list = [10, 20, 30];

for (let item of list) { // 直接获取元素值

  console.log(item); // 输出:10, 20, 30

}

遍历对象属性 → Object.keys()

let obj = {a: 1, b: 2};

Object.keys(obj).forEach(key => {

  console.log(key + ": " + obj[key]); // 输出:a:1, b:2

});

7.查看Map的key是否包含某个Key ,将Keys转为Array,其他方法类似

报错:

Property 'indexOf' does not exist on type 'IterableIterator<string>'. <ArkTSCheck>

将Map的keys转为Array,然后在调用IndexOf的方法,因为IndexOf的方法属于Array

let keys = ["appId","deviceId","os","channel","version","clientTime","nonce"]

for (let key of keys){

  if (Array.from(requestData.keys()).indexOf(key) != -1) {

    signData[key] = requestData[key]

  }

}

8.对字符串类型的判断

在ArkTs中字符串会出现String 和 string 两种类型,其实是一个东西,但是在定义Map Array等时,需要定义类型,或者是需要取值判断类型

(1)对于String 使用方法instanceof

(2)对于string 类型使用typeof value ==='string'

typeof 运算符:

直接返回值的类型名称(如 'string'、'number' 等),是判断基础类型的标准方式。

严格相等判断

需使用 === 'string' 精确匹配类型名称字符串。

适用场景

适用于基础类型检测,不适用于复杂对象(如 String 对象实例)。

// 检测包括字符串对象

if (value instanceof String || typeof value === 'string') {

  // 处理逻辑

}

9.Map的赋值容易引起的问题

由于是iOS开发,总是容易使用字面量的方式对Map赋值

map[key] = value

但是无论是ArkTs 还是 TypeScript 中都没有对应赋值方式,最关键的是这样赋值也不会报错,但是一旦取值就会出现不存在的问题

TypeScript

ArkTs ArkTs Map的内容

在对Map赋值使用set方法,取值使用get方法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容