HarmonyOS 鸿蒙Next sendablePreferences在UIAbility与FormExtensionAbility中同时使用经常获取不到数据
HarmonyOS 鸿蒙Next sendablePreferences在UIAbility与FormExtensionAbility中同时使用经常获取不到数据
刷新了也不行,FormExtensionAbility
里用的都是Sync,这种同步的方法在UIAbility
同步和异步的,都有用到。
具体代码:
DayCardRepo.ets文件168行 `await PreferenceModel.modifyDayCard(newDayCard)` 函数修改数据前没有 `removePreferences`,
修改建议:建议修改数据前先重新获取Preferences
```javascript
export class PreferenceModel {
/**初始化preferences*/
getPreferencesFromStorage(context: Context) {
try {
sendablePreferences.removePreferencesFromCacheSync(context, options)//添加代码
preference = sendablePreferences.getPreferencesSync(context, options)
} catch (err) {
Logger.error("PreferenceModel", `获取preferences失败, 原因: ${err}`)
console.info("PreferenceModel", `获取preferences失败, 原因: ${err}`)
}
}
}
await PreferenceModel.getPreferencesFromStorage(context)//添加代码
await PreferenceModel.modifyDayCard(newDayCard)
修改后 let has = PreferenceModel.hasPreferenceSync(ConstUtil.KeyFormInfos)
结果为 true,符合预期。
但是测试中后续代码 formInfo.formId
不等于 dayCard.id
导致卡片仍未刷新,该问题请自己分析。
if (formInfo.formId == dayCard.id) {
FormUtil.refreshForm(formInfo.formId, formInfo.dayCard)
}
问题根因:
假设首选项中存在1.2.3.4这4条数据
A进程put了数据5,并flush,此时有1.2.3.4.5这5条数据
B进程删除了数据4,并进行了flush,此时B进程中只有1.2.3这3条数据
正确做法是在B进程删除数据前,先 removePreferences
,再 getPreferences
,然后再修改数据
注:上述代码只是在出问题的地方做出了修改,建议结合业务逻辑自行修改,确保跨进程时先 removePreferences
,再 getPreferences
。
更多关于HarmonyOS 鸿蒙Next sendablePreferences在UIAbility与FormExtensionAbility中同时使用经常获取不到数据的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS中,sendablePreferences
用于跨组件安全地共享数据。如果在 UIAbility
与 FormExtensionAbility
中同时使用 sendablePreferences
时经常获取不到数据,可能的原因和解决方案如下:
-
数据同步问题:确保在写入数据后,读取操作发生在数据写入被正确同步之后。
sendablePreferences
的数据同步可能受到系统调度或网络延迟的影响。 -
Key值不匹配:检查在
UIAbility
和FormExtensionAbility
中使用的 key 值是否完全一致。任何微小的差异(如空格、大小写)都会导致数据获取失败。 -
权限问题:确保两个Ability都有权限访问相同的
sendablePreferences
实例。权限配置不当可能导致数据访问受限。 -
数据格式问题:如果存储的数据是复杂对象,确保在序列化和反序列化过程中数据格式保持一致,避免数据损坏。
-
Ability生命周期:考虑
UIAbility
和FormExtensionAbility
的生命周期。如果在一个Ability中写入数据后立即尝试在另一个Ability中读取,而该Ability尚未完全启动或已处于后台,可能会影响数据获取。
如果问题依旧没法解决请联系官网客服, 官网地址是 https://www.itying.com/category-93-b0.html,