HarmonyOS鸿蒙Next中har中拿不到数据

HarmonyOS鸿蒙Next中har中拿不到数据

我在entry中初始化preferences

createFontPreferences(context: Context) {
  let fontPreferences: Function = (() => {
    let preference: Promise<preferences.Preferences> = preferences.getPreferences(context, PREFERENCES_NAME);
    return preference;
  });
  GlobalContext.getContext().setObject('getFontPreferences', fontPreferences);
  let getFontPreferences: Function = GlobalContext.getContext().getObject('getFontPreferences') as Function;
}

然后再hsp中设置preferences

saveChangeFontSize(fontSize: number) {
  let getFontPreferences: Function = GlobalContext.getContext().getObject('getFontPreferences') as Function;
  getFontPreferences().then(async (preferences: preferences.Preferences) => {
    await preferences.put(KEY_APP_FONT_SIZE, fontSize);
    preferences.flush();
  }).catch((err: Error) => {
    Logger.error(TAG, 'put the preferences failed, err: ' + err);
  });
}

然后preferencesutils类在har中,hsp,entry都是调用har的utils,但是拿不到这个

let getFontPreferences: Function = GlobalContext.getContext().getObject('getFontPreferences') as Function;

提示undefined怎么办


更多关于HarmonyOS鸿蒙Next中har中拿不到数据的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复
创建工具类 ---> Preferences.ts

```javascript
import dataPreferences from '[@ohos](/user/ohos).data.preferences';

class Preferences {
  preMap: Map<string, dataPreferences.Preferences> = new Map();

  async loadPreference(context, name: string) {
    try {
      // 获取Preferences实例
      let pref = await dataPreferences.getPreferences(context, name);
      this.preMap.set(name, pref);
      console.log('testTag',`加载Preference[${name}]成功`);
    } catch (e) {
      console.log('testTag',`加载Preference[${name}]失败`,JSON.stringify(e));
    }
  }

  async getPreferenceValue(name:string,key:string,defaultValue:dataPreferences.ValueType) {

    if (!this.preMap.has(name)) {
      console.log('testTag',`Preferences[${name}]未初始化`);
      return;
    }
    try {
      let pref = this.preMap.get(name);
      //读取数据
      let value = await pref?.get(key,defaultValue)
      console.log('testTag',`读取Preferences[${name}.${key} = ${value}]成功`);
      return value;
    } catch (e) {
      console.log('testTag',`读取Preferences[${name}.${key}]失败`,JSON.stringify(e));
    }
  }

  async putPreferenceValue(name:string,key:string,value:dataPreferences.ValueType) {

    if (!this.preMap.has(name)) {
      console.log('testTag',`Preferences[${name}]未初始化`);
      return;
    }
    try {
      let pref = this.preMap.get(name);
      // 写入数据
      await pref?.put(key,value);
      // 刷新磁盘
      await pref?.flush();
      console.log('testTag',`保存Preferences[${name}.${key} = ${value}]成功`);
    } catch (e) {
      console.log('testTag',`保存Preferences[${name}.${key} = ${value}]失败`,JSON.stringify(e));
    }
  }
}

const preferenceUtil = new Preferences();
export default preferenceUtil as Preferences

使用:

1、在EntryAbility.ets 导入

import PreferencesUtil from '../common/util/PreferencesUtil'

2、

async onCreate(want, launchParam) {
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate running');
// 加载Preferences
await PreferencesUtil.loadPreference(this.context, 'MyPreferences')
}

更多关于HarmonyOS鸿蒙Next中har中拿不到数据的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,如果无法从HAR(HarmonyOS Ability Resources)中获取数据,可能是由于以下原因导致的:

  1. 资源文件路径错误:确保在代码中引用的资源路径正确,路径应与HAR包中的实际路径一致。

  2. HAR包未正确导入:检查项目是否成功导入了HAR包。可以通过查看oh-package.json5文件确认依赖是否添加正确。

  3. 资源ID冲突:如果项目中存在多个HAR包,且资源ID重复,可能会导致资源获取失败。确保资源ID在项目中唯一。

  4. 资源未正确编译:确认HAR包中的资源文件已正确编译并打包。可以通过检查build目录下的资源文件是否存在来确认。

  5. 权限问题:某些资源可能需要特定的权限才能访问,确保应用已获取所需的权限。

  6. 版本兼容性问题:鸿蒙Next版本可能与HAR包的版本不兼容,导致资源无法正确加载。检查HAR包与鸿蒙Next版本的兼容性。

  7. 资源加载时机问题:确保在资源加载时,相关的上下文环境已正确初始化。资源加载时机过早或过晚可能导致获取失败。

  8. 资源类型不匹配:确认获取的资源类型与代码中使用的类型一致。例如,字符串资源应使用getString方法获取,而非其他类型的方法。

如果以上问题均已排除,建议检查日志输出,查看是否有相关的错误信息提示,以便进一步定位问题。

在HarmonyOS鸿蒙Next中,HAR(HarmonyOS Ability Resource)模块无法获取数据,可能是以下原因导致的:

  1. 资源路径错误:确保在代码中引用的资源路径与HAR模块中的实际路径一致。
  2. 资源未正确打包:在构建HAR模块时,资源文件未正确打包到HAR中,需检查oh-package.json5配置。
  3. 跨模块访问限制:如果从其他模块访问HAR资源,需确保已正确配置模块依赖关系。
  4. 运行时权限问题:检查应用是否具备访问相关资源的权限。

建议使用DevEco Studio的调试工具检查资源加载情况,并确保HAR模块配置正确。

回到顶部