HarmonyOS 鸿蒙Next sendablePreferences在UIAbility与FormExtensionAbility中同时使用经常获取不到数据

发布于 1周前 作者 eggper 来自 鸿蒙OS

HarmonyOS 鸿蒙Next sendablePreferences在UIAbility与FormExtensionAbility中同时使用经常获取不到数据 刷新了也不行,FormExtensionAbility里用的都是Sync,这种同步的方法在UIAbility同步和异步的,都有用到。

2 回复
具体代码:

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 用于跨组件安全地共享数据。如果在 UIAbilityFormExtensionAbility 中同时使用 sendablePreferences 时经常获取不到数据,可能的原因和解决方案如下:

  1. 数据同步问题:确保在写入数据后,读取操作发生在数据写入被正确同步之后。sendablePreferences 的数据同步可能受到系统调度或网络延迟的影响。

  2. Key值不匹配:检查在 UIAbilityFormExtensionAbility 中使用的 key 值是否完全一致。任何微小的差异(如空格、大小写)都会导致数据获取失败。

  3. 权限问题:确保两个Ability都有权限访问相同的 sendablePreferences 实例。权限配置不当可能导致数据访问受限。

  4. 数据格式问题:如果存储的数据是复杂对象,确保在序列化和反序列化过程中数据格式保持一致,避免数据损坏。

  5. Ability生命周期:考虑 UIAbilityFormExtensionAbility 的生命周期。如果在一个Ability中写入数据后立即尝试在另一个Ability中读取,而该Ability尚未完全启动或已处于后台,可能会影响数据获取。

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

回到顶部