HarmonyOS 鸿蒙Next中服务卡片无法获取数据
HarmonyOS 鸿蒙Next中服务卡片无法获取数据 【问题描述】:当前使用服务卡片需要展示对应生理周期相关的信息: 例如 当前是经期多少天等 具体数据为接口返回,当前实现方式为 主进程内请求数据 然后保存数据至首选项缓存;
【问题现象】:服务卡片设置定时刷新 在定时刷新的方法内 去获取首选项缓存数据来刷新卡片信息; 但是当前发现 使用首选项缓存 卡片并没有获取到相关数据
【版本信息】:不涉及
【复现代码】:
//此处为EntryFormAbility 的onUpdateForm方法实现
onUpdateForm(formId: string) {
// Called to notify the form provider to update a specified form.
let resultInfo:object[] = [];
// 这一段注释 卡片的periodStateDes字段会显示 345 放开则显示卡片最初的字段 不会显示 123或者345
const context = getContext(this) as common.UIAbilityContext;
preferences.removePreferencesFromCacheSync(context,'testDataSave')
let perferceObj = preferences.getPreferencesSync(context,{name:"testDataSave"})//.getSync("test",[]) as object[];
if (perferceObj) {
let result = perferceObj.getSync("test",[]) as object[];
if (result) {
resultInfo.push()
}
}
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
const charArray = chars.split(''); // 空字符串作为分隔符
let result = '';
for (let i = 0; i < 5; i++) {
const randomIndex = Math.floor(Math.random() * chars.length);
result += charArray[randomIndex];
}
const bindingData: formBindingData.FormBindingData = formBindingData.createFormBindingData({
'titleForm':result,
'periodStateDes':resultInfo.length > 0 ? "123":"345",
});
setTimeout(()=>{
formProvider.updateForm(formId, bindingData).then((data) => {
console.info('FormAbility updateForm success.' + JSON.stringify(bindingData));
}).catch((error:BusinessError) => {
console.error('FormAbility updateForm failed: ' + JSON.stringify(error));
})
}, 500)
}
//在EntryAbility中创建了首选项缓存
preferences.getPreferencesSync(this.context,{name:"testDataSave"});
【尝试解决方案】:尝试了不同进程的内存不共享,同一进程中qetPreferences只有首次会从持久化中取,所以要跨进程读取最新的持久化数据时,通过preferences.removePreferencesFromCache接口将Preferences实例移出缓存中的实例之后,再次getPreferences将会重新读取持久化文件,生成新的Preferences实例。以主应用中更新首选顶中的data,在服务卡片中通过首选项取data为例。
但是在实际使用中使用preferences.removePreferencesFromCache后在读获取Preferences实例,卡片刷新函数感觉是有报错 无法看到日志 且没有数据刷新操作
更多关于HarmonyOS 鸿蒙Next中服务卡片无法获取数据的实战教程也可以访问 https://www.itying.com/category-93-b0.html
试试MMKV来存储呢,MMKV 支持跨进程共享
[https://ohpm.openharmony.cn/#/cn/detail/@tencent%2Fmmkv](https://ohpm.openharmony.cn/#/cn/detail/@tencent%2Fmmkv)
更多关于HarmonyOS 鸿蒙Next中服务卡片无法获取数据的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,服务卡片无法获取数据可能由以下原因导致:卡片提供方未正确配置数据源或数据请求权限;卡片生命周期管理不当,未在onCreate或onUpdate方法中实现数据加载;分布式数据管理未启用或设备间数据同步失败;卡片配置文件(config.json)中数据能力声明不完整。检查卡片代码中数据请求逻辑,确保使用鸿蒙数据管理API(如DataAbility)并正确声明所需权限。
在HarmonyOS Next中,服务卡片与主应用属于不同进程,直接通过首选项缓存共享数据确实会遇到问题。从你的代码分析,主要问题在于:
-
进程隔离导致的数据不同步:虽然你使用了
removePreferencesFromCacheSync尝试强制重新读取,但跨进程的首选项访问需要确保数据已持久化到磁盘。 -
代码逻辑问题:在
onUpdateForm方法中,resultInfo.push()没有参数,这会导致空数组,所以periodStateDes始终显示"345"。
建议修改方案:
onUpdateForm(formId: string) {
const context = getContext(this) as common.UIAbilityContext;
// 确保先移除缓存实例
preferences.removePreferencesFromCacheSync(context, 'testDataSave');
let perferceObj = preferences.getPreferencesSync(context, {name: "testDataSave"});
if (perferceObj) {
let result = perferceObj.getSync("test", []) as object[];
const bindingData = formBindingData.createFormBindingData({
'titleForm': 'your_title',
'periodStateDes': result.length > 0 ? "123" : "345",
});
formProvider.updateForm(formId, bindingData).then((data) => {
console.info('FormAbility updateForm success.');
}).catch((error: BusinessError) => {
console.error('FormAbility updateForm failed: ' + JSON.stringify(error));
});
}
}
同时确保在主应用更新数据时调用preferences.flush()强制写入磁盘,确保服务卡片能读取到最新数据。

