Android中使用Hilt将UIApp注入SoundViewModel的方式是否合理?
你的Hilt注入UIApp的实现存在问题,正确方式看这里
你的代码里手动创建UIApp实例的做法是错误的,直接说问题和修正方案:
问题所在
Android系统中Application实例是由系统负责初始化的,整个应用生命周期内只有一个全局实例。你在provideUIApp()里通过return UIApp()手动new出来的对象,和系统实际运行的Application实例完全不是同一个,会导致上下文相关功能失效、状态不一致等问题。
而且你已经给UIApp加了@HiltAndroidApp注解,Hilt会自动把这个自定义Application类作为单例绑定到依赖容器中,根本不需要额外写@Provides方法来提供。
修正后的代码
- 保留UIApp的代码不变:
@HiltAndroidApp class UIApp : Application() { fun log(){ Log.e("my","Server") } }
- 删除多余的
ObjectModule(如果这个模块只有provideUIApp()这一个方法的话):
// 直接删掉这个模块,完全不需要它 // @InstallIn(SingletonComponent::class) // @Module // object ObjectModule { // @Provides // @Singleton // fun provideUIApp(): UIApp { // return UIApp() // } // }
- 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
相关产品推荐
相关产品推荐

