HarmonyOS Developer 基于ArkTS开发常见问题
概述
Ability框架开发
- 查看配置文件的所有字段说明
- 使Ability可以被其他应用调用
- 分别实现JS Ability跳转JS Ability和Java Ability(JS)
- 旋转屏幕,如何防止界面生命周期重启
- 在设备上设置Ability的landscape属性,运行后如何取消小窗显示
- 跳转到其他应用时报错“[c4d4d3492eb8531, 0, 0] ContextDeal::startAbility fetchAbilities failed”
- 更新SDK后提示 “@ohos.application.Ability”/“@ohos.application.AbilityStage”等模块找不到或者无相关类型声明
- 编译hap包时,找不到registerEnvironmentCallback、unregisterEnvironmentCallback等接口
UI开发
- Shape组件设置填充色为透明(ArkTS)
- 如何设置状态栏颜色(JS/ArkTS)
- 如何创建成对的key:value的Map变量(ArkTS)
- List开发如何获取其滚动时Y轴偏移量(ArkTS)
- 图片资源放置目录(JS)
- video组件无法播放音频(JS)
- 使用npm引入三方包(JS)
- 引用js代码文件时使用工程下的绝对路径(JS)
- 判断方法是否为异步方法(JS)
- 多媒体资源加载失败(JS)
- 使用<image>标签引入的本地图片无法加载(JS)
- 网络图片无法加载(JS/ArkTS)
- 是否可以利用轻量级智能穿戴的物理按键开发应用的交互设计(JS)
- 轻量级智能穿戴的文件句柄是否有上限(JS)
- 关于轻量级智能穿戴k-v键值储存问题(JS)
- 轻量级智能穿戴开发如何获取dom中的元素(JS)
- 如何在页面间传值(JS)
- list如何滚动到某个item(JS)
- 轻量级智能穿戴text是否支持多行(JS)
- 控件不显示(JS)
- 添加的页面不显示(JS)
- 轻量级智能穿戴如何使用定时器(JS)
- 轻量级智能穿戴的Left、Top为什么不生效(JS)
- 动态绑定为什么不生效(JS)
- 轻量级智能穿戴实现相对定位和绝对定位(JS)
- 如何控制组件的显示与隐藏(JS)
- 使用另一个js文件中的常量(JS)
- 控制块元素横纵向排列(JS)
- 控制一个元素显示或隐藏(JS)
- JS是否可以调用C++的so库(JS)
- JS模块export的module在别的JS文件中import,修改不生效(JS)
- 设置了border-left-radius属性后没有任何效果(JS)
- list在手表上有时候自动放大(JS)
- 如何使用list组件的scrollTo方法(JS)
- 去掉list-item在按下时出现的阴影(JS)
- video组件在预览时出现‘初始化播放器失败’(JS)
- image组件切换图源(JS)
- 整齐等宽地展示采用for循环的图片列表(JS)
- 不通过点击控制checkbox的勾选状态(JS)
- 纵向排列文本(JS)
- 文本超出时显示省略号(JS)
- 通过js方法实现点击input组件并打开键盘的效果(JS)
- API 8 slider的步长step设置为0.1之后实际依然为1(JS)
- 使用ForEach/LazyForEach渲染语法渲染组件,组件仅显示一个或者丢失部分子组件(ArkTS)
- 修改ForEach使用的数据对象,UI不刷新(ArkTS)
- 使用LazyForEach渲染语法渲染组件,UI不刷新(ArkTS)
- 使用LazyForEach嵌套LazyForEach(或ForEach)显示异常(ArkTS)
- IF条件变化后UI不刷新(ArkTS)
网络与连接开发
设备管理开发
数据管理开发
DFX开发
使用hilog的格式参数类型为%d或者%s时,日志打印为何显示private
相关资源
- 应用审核相关FAQ
- 智能助手:通过问答的形式,直接获取常见问题的解决方法。
- 开发者论坛:官方问题反馈渠道,方便开发者进行问题讨论。
Ability框架开发
查看配置文件的所有字段说明
Stage模型下应用配置文件为“app.json5”和“module.json5”,各字段说明请查阅应用配置文件(Stage模型)。
FA模型下应用配置文件为“config.json”,各字段说明请查阅应用配置文件(FA模型)。
使Ability可以被其他应用调用
需要在“config.json”文件中将“abilities”字段的“visible”标签设置为“true”。
分别实现JS Ability跳转JS Ability和Java Ability(JS)
JS Ability跳转JS Ability,示例代码参考:
import router from '@system.router'
export default {
launch() {
router.push ({
uri: 'pages/detail/detail',
});
},
}
JS Ability跳转Java Ability,使用FeatureAbility.startAbility实现跳转,具体能力说明参考JS FA如何调用PA。
示例代码参考:
async jumpJavaAbility() {
var action = {};
action.bundleName = 'com.huawei.cookbook';
action.abilityName = 'com.huawei.myjsapplication.JavaAbility';
await FeatureAbility.startAbility(action);
}
旋转屏幕,如何防止界面生命周期重启
适用于:HarmonyOS SDK 3.1.1.1版本,API8 FA模型
在config.json文件中添加configChanges属性为orientation。
在设备上设置Ability的landscape属性,运行后如何取消小窗显示
适用于:HarmonyOS SDK 3.0版本
由于代码中设置了smartWindowDeviceType为手机、平板,代码如下:
"smartWindowDeviceType": ["phone", "tablet"]
即选择了支持浮窗的设备为手机、平板,所以真机运行时会显示浮窗效果,如不需要显示取消设置即可。
跳转到其他应用时报错“[c4d4d3492eb8531, 0, 0] ContextDeal::startAbility fetchAbilities failed”
适用于:HarmonyOS SDK 3.0版本,API8 FA模型
一般用startAbility,实现如下:
function onStartRemoteAbility() {
console.info('onStartRemoteAbility begin');
let params;
let wantValue = {
bundleName: 'ohos.samples.etsDemo',
abilityName: 'ohos.samples.etsDemo.RemoteAbility',
deviceId: getRemoteDeviceId(),
parameters: params
};
console.info('onStartRemoteAbility want=' + JSON.stringify(wantValue));
featureAbility.startAbility({
want: wantValue
}).then((data) => {
console.info('onStartRemoteAbility finished, ' + JSON.stringify(data));
});
console.info('onStartRemoteAbility end');
}
可参考PageAbility开发指导。
更新SDK后提示 “@ohos.application.Ability”/“@ohos.application.AbilityStage”等模块找不到或者无相关类型声明
问题现象
更新SDK后报错“Cannot find module '@ohos.application.AbilityStage' or its corresponding type declarations”,“Cannot find module '@ohos.application.Ability' or its corresponding type declarations”。
解决措施
模块名有所变更,可以尝试替换为新的模块名(常用接口如下):
原有接口 | 新接口 |
@ohos.application.Ability | @ohos.app.ability.UIAbility |
@ohos.application.AbilityStage | @ohos.app.ability.AbilityStage |
- 使用了旧接口@ohos.application.Ability。
import Ability from '@ohos.application.Ability';
可以通过直接修改import,来切换到新的namespace上:
import Ability from '@ohos.app.ability.UIAbility';
- 使用了旧接口@ohos.application.AbilityStage。
import AbilityStage from '@ohos.application.AbilityStage';
可以通过直接修改import,来切换到新的namespace上:
import AbilityStage from '@ohos.app.ability.AbilityStage'
更多问题处理请参考变更说明及适配指导。
编译hap包时,找不到registerEnvironmentCallback、unregisterEnvironmentCallback等接口
问题现象
编译hap包时,报错Property 'registerEnvironmentCallback' does not exist on type 'ApplicationContext',Property 'unregisterEnvironmentCallback' does not exist on type 'ApplicationContext'。
解决措施
注册注销回调方法registerEnvironmentCallback、unregisterEnvironmentCallback接口名变更,需要替换为新的on、off接口。
代码示例
如原先使用了接口registerEnvironmentCallback、unregisterEnvironmentCallback:
import UIAbility from '@ohos.app.ability.UIAbility'
import common from '@ohos.app.ability.common';
let callbackId;
export default class EntryAbility extends UIAbility {
onCreate() {
console.log("onCreate");
let environmentCallback = {
onConfigurationUpdated(config){
console.log("onConfigurationUpdated config:" + JSON.stringify(config));
},
onMemoryLevel(level){
console.log("onMemoryLevel level:" + level);
}
}
// 1. 获取applicationContext
let applicationContext: common.ApplicationContext = this.context.getApplicationContext();
// 2. 注册回调函数environmentCallback
callbackId = applicationContext.registerEnvironmentCallback(environmentCallback);
console.log("registerEnvironmentCallback number: " + JSON.stringify(callbackId));
}
onDestroy() {
console.log("onDestroy")
// 1. 获取applicationContext
let applicationContext: common.ApplicationContext = this.context.getApplicationContext();
// 2. 注销回调函数environmentCallback
applicationContext.unregisterEnvironmentCallback(callbackId, (error) => {
console.log("unregisterEnvironmentCallback success, err: " + JSON.stringify(error));
});
}
// ...
};
可以修改为使用on、off:
import UIAbility from '@ohos.app.ability.UIAbility'
import common from '@ohos.app.ability.common';
let callbackId;
export default class EntryAbility extends UIAbility {
onCreate() {
console.log("onCreate")
let environmentCallback = {
onConfigurationUpdated(config) {
console.log("onConfigurationUpdated config:" + JSON.stringify(config));
},
onMemoryLevel(level) {
console.log("onMemoryLevel level:" + level);
}
}
// 1. 获取applicationContext
let applicationContext: common.ApplicationContext = this.context.getApplicationContext();
// 2. 注册回调函数environmentCallback
callbackId = applicationContext.on("environment", environmentCallback);
console.log("registerEnvironmentCallback number: " + JSON.stringify(callbackId));
}
onDestroy() {
console.log("onDestroy")
// 1. 获取applicationContext
let applicationContext: common.ApplicationContext = this.context.getApplicationContext();
// 2. 注销回调函数environmentCallback
applicationContext.off("environment", callbackId, (error) => {
console.log("unregisterEnvironmentCallback success, err: " + JSON.stringify(error));
});
}
// ...
};
网络与连接开发
使用网络图片,运行应用无法加载图片
问题现象
做一个图片展示的demo,使用本地化图片(使用common路径),应用成功加载图片;使用网络化图片(使用图片地址),运行应用无法加载图片。
解决措施
加载网络图片需要授权:ohos.permission.INTERNET。
设备管理开发
如何获取系统API版本号(JS/ArkTS)
示例代码如下:
import deviceInfo from '@ohos.deviceInfo'
let sdkApiVersion = deviceInfo.sdkApiVersion
console.info('sdkApiVersion: '+sdkApiVersion)
开发智能穿戴应用,获取心率信息(JS)
请参考如下代码实现,其中heartRate即为心率值:
sensor.subscribeHeartRate({
success: function(ret) {
console.log('get heartrate value:' + ret.heartRate);
},
fail: function(data, code) {
console.log('subscribe heartrate fail, code: ' + code + ', data: ' + data);
},
});
详情请参考:JS API参考-传感器。
调用getThermalLevel获取热档位信息,返回undefined(JS/ArkTS)
存在服务异常,目前情况下,只能尝试重新调用。
数据管理开发
如何实现数据存储与获取(JS/ArkTS)
导入相关包:
import dataStorage from '@ohos.data.storage'
import featureAbility from '@ohos.ability.featureAbility'
数据存储:
context.getFilesDir((err, path) => {
if (err) {
console.info("Get the storage failed, path: " + path + '/mystore')
return;
}
console.info('getFilesDir successful. path:' + JSON.stringify(path));
let promisegetSt = dataStorage.getStorage(path + '/mystore')
promisegetSt.then((storage) => {
console.info('getStorage successful. storage:' + JSON.stringify(storage));
storage.putSync('startup', 'auto')
storage.flushSync()
}).catch((err) => {
console.info('getFilesDir failed. err:' + JSON.stringify(err));
console.info("Get the storage failed, path: " + path + '/mystore')
})
});
数据获取:
var context = featureAbility.getContext()
context.getFilesDir((err, path) => {
if (err) {
console.info("Get the storage failed, path: " + path + '/mystore')
return;
}
console.info('getFilesDir successful. path:' + JSON.stringify(path));
let promisegetSt = dataStorage.getStorage(path + '/mystore')
promisegetSt.then((storage) => {
console.info('getStorage successful. storage:' + JSON.stringify(storage));
let value = storage.getSync('startup', 'default')
console.info('getSync successful. value:' + value);
}).catch((err) => {
console.info('getFilesDir failed. err:' + JSON.stringify(err));
console.info("Get the storage failed, path: " + path + '/mystore')
})
});
rdb关系型数据库中TEXT类型保存超长文本失败
适用于:API8及以下版本
API7以及API8版本对TEXT文本存储长度限制在1024字节,在API9以上的版本中已经放开了限制。
DFX开发
使用hilog的格式参数类型为%d或者%s时,日志打印为何显示private
直接使用%d、%s等格式化参数时,标准系统默认使用private替换真实数据进行打印,防止数据泄露。
如果需要打印出真实数据,需要使用%{public}d替换%d或者%{public}s替换%s。