You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中使用Hilt将UIApp注入SoundViewModel的方式是否合理?

你的Hilt注入UIApp的实现存在问题,正确方式看这里

你的代码里手动创建UIApp实例的做法是错误的,直接说问题和修正方案:

问题所在

Android系统中Application实例是由系统负责初始化的,整个应用生命周期内只有一个全局实例。你在provideUIApp()里通过return UIApp()手动new出来的对象,和系统实际运行的Application实例完全不是同一个,会导致上下文相关功能失效、状态不一致等问题。

而且你已经给UIApp加了@HiltAndroidApp注解,Hilt会自动把这个自定义Application类作为单例绑定到依赖容器中,根本不需要额外写@Provides方法来提供。

修正后的代码

  1. 保留UIApp的代码不变:
@HiltAndroidApp
class UIApp : Application() {
    fun log(){
        Log.e("my","Server")
    }
}
  1. 删除多余的ObjectModule(如果这个模块只有provideUIApp()这一个方法的话):
// 直接删掉这个模块,完全不需要它
// @InstallIn(SingletonComponent::class)
// @Module
// object ObjectModule {  
//     @Provides
//     @Singleton
//     fun provideUIApp(): UIApp {
//         return UIApp()
//     }
// }
  1. SoundViewModel的注入代码保持原样即可,Hilt会自动注入系统创建的UIApp实例:
@HiltViewModel
class SoundViewModel @Inject constructor(         
    private val myapp: UIApp,
    private val savedStateHandle: SavedStateHandle
): ViewModel() {
   // 正常调用myapp.log()等方法即可
}

补充说明

@HiltAndroidApp注解的核心作用之一就是让Hilt接管Application的初始化流程,同时将该自定义Application类以单例形式绑定到SingletonComponent中,所以你可以直接在ViewModel、Repository等需要的地方通过构造注入获取它,不需要手动处理实例创建。

内容的提问来源于stack exchange,提问作者HelloCW

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 08:17:43