鸿蒙Next中如何在ViewModel等非UI界面实现getContext(this).resourceManager

在鸿蒙Next开发中,ViewModel等非UI类无法直接调用getContext(this).resourceManager获取资源管理器。由于ViewModel不持有Activity/Fragment的Context引用,常规方式会导致内存泄漏或空指针异常。请问如何在这种非UI环境下安全获取ResourceManager对象?是否有官方推荐的依赖注入方式或替代方案?

2 回复

鸿蒙Next里,ViewModel想拿ResourceManager?简单!用LocalStorage传进去,或者用依赖注入。别直接getContext(this),ViewModel可不是UI组件,得优雅地“借”资源管理器!

更多关于鸿蒙Next中如何在ViewModel等非UI界面实现getContext(this).resourceManager的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在鸿蒙Next中,ViewModel等非UI类无法直接获取Context,因此需要通过以下方式间接获取ResourceManager:

推荐方案:通过UI层传递ResourceManager

  1. 在UI中获取并传递给ViewModel
// 在EntryAbility.ts中
onWindowStageCreate(windowStage: window.WindowStage) {
  let resourceManager = this.context.resourceManager;
  // 通过构造函数或方法传递给ViewModel
  let viewModel = new MyViewModel(resourceManager);
}

// ViewModel中
class MyViewModel {
  private resourceManager: resource.ResourceManager;

  constructor(resourceManager: resource.ResourceManager) {
    this.resourceManager = resourceManager;
  }

  async getStringValue(resId: number) {
    try {
      return await this.resourceManager.getStringValue(resId);
    } catch (error) {
      console.error('Get string value failed, error: ' + error);
    }
  }
}
  1. 通过全局单例管理(备选方案)
// ResourceManager单例类
export class ResourceManagerUtil {
  private static instance: ResourceManagerUtil;
  private resourceManager: resource.ResourceManager;

  static getInstance(): ResourceManagerUtil {
    if (!ResourceManagerUtil.instance) {
      ResourceManagerUtil.instance = new ResourceManagerUtil();
    }
    return ResourceManagerUtil.instance;
  }

  setResourceManager(resourceManager: resource.ResourceManager) {
    this.resourceManager = resourceManager;
  }

  getResourceManager(): resource.ResourceManager {
    return this.resourceManager;
  }
}

// 在Ability中初始化
ResourceManagerUtil.getInstance().setResourceManager(this.context.resourceManager);

// 在ViewModel中使用
let resourceManager = ResourceManagerUtil.getInstance().getResourceManager();

注意事项:

  • 确保在Ability初始化完成后再使用ResourceManager
  • 优先采用依赖注入方式(方案1),避免全局状态管理
  • 资源ID需要通过$r('app.string.xxx')方式获取

这种方式符合鸿蒙Next的架构规范,保证了UI与业务逻辑的分离。

回到顶部