鸿蒙Next中如何在ViewModel等非UI界面实现getContext(this).resourceManager
在鸿蒙Next开发中,ViewModel等非UI类无法直接调用getContext(this).resourceManager获取资源管理器。由于ViewModel不持有Activity/Fragment的Context引用,常规方式会导致内存泄漏或空指针异常。请问如何在这种非UI环境下安全获取ResourceManager对象?是否有官方推荐的依赖注入方式或替代方案?
2 回复
在鸿蒙Next中,ViewModel等非UI类无法直接获取Context,因此需要通过以下方式间接获取ResourceManager:
推荐方案:通过UI层传递ResourceManager
- 在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);
}
}
}
- 通过全局单例管理(备选方案)
// 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与业务逻辑的分离。


