Android+Kotlin+Hilt:非Activity类无法@Inject注入问题解决
Hilt非Activity类依赖注入问题排查与解决
问题背景
最近开始学习Hilt,目前困扰多于乐趣,但喜欢挑战。核心问题是**非Activity类中注入依赖(如Context或自定义类)**遇到障碍:之前大量非Activity类用object单例实现,但无法向单例注入依赖,改为普通类后尝试字段注入,编译正常但注入字段始终为空,触发未初始化错误,同时不确定如何正确获取Context。项目为多模块结构,示例中AWFile类位于Common模块,负责文件操作,尝试注入AppSettings(配置存储类)和Context。
初始代码与错误
AWApplication(App模块)
@HiltAndroidApp class AWApplication : MultiDexApplication() { }
AWFile(Common模块)
class AWFile @Inject constructor() { @Inject lateinit var app: AppSettings @Inject lateinit var context: Context fun doSomething(){ var color = app.actionBarEndColor var ctx = context } ... }
App模块Dependencies
@Module @InstallIn(SingletonComponent::class) class Dependencies { @Provides @ApplicationContext fun provideContext(@ApplicationContext appContext: Context): Context { return appContext } }
Common模块Dependencies
@Module @InstallIn(SingletonComponent::class) class Dependencies { @ApplicationContext lateinit var appContext: Context @Provides @Singleton fun bindsAppSettings(): AppSettings { return AppSettings() } @Provides @Singleton fun bindsAWFile(): AWFile { return AWFile() } }
MainActivity(App模块)
@AndroidEntryPoint class MainActivity : FragmentActivity() { @Inject lateinit var awFile: AWFile @Inject lateinit var app: AppSettings override fun onCreate(savedInstanceState: Bundle?) { requestWindowFeature(Window.FEATURE_CUSTOM_TITLE) super.onCreate(savedInstanceState) awFile.doSomething() } }
触发错误
调用awFile.doSomething()时抛出:
kotlin.UninitializedPropertyAccessException: lateinit property app has not been initialized (the same for context)
调试过程
编辑1:尝试构造注入替代字段注入
修改AWFile构造方法:
class AWFile @Inject constructor(private var app: AppSettings, private var context: Context)
Common模块Dependencies未修改,编译失败,提示bindsAWFile()方法未给AWFile传递必要参数。
编辑2:调整Dependencies方法参数
修改Common模块Dependencies:
@Module @InstallIn(SingletonComponent::class) class Dependencies { @ApplicationContext lateinit var appContext: Context @Provides @Singleton fun bindsAppSettings(): AppSettings { return AppSettings() } @Provides @Singleton fun bindsAWFile(appSettings: AppSettings): AWFile { return AWFile(appSettings, appContext) } }
运行时抛出:
...Caused by: kotlin.UninitializedPropertyAccessException: lateinit property appContext has not been initialized at dependencies.Dependencies.getAppContext(Dependencies.kt:18)...
最终解决方案
App模块Dependencies
@Module @InstallIn(SingletonComponent::class) class Dependencies { @Provides @Singleton fun provideContext(@ApplicationContext appContext: Context): Context { return appContext } }
Common模块Dependencies
@Module @InstallIn(SingletonComponent::class) class Dependencies { @Provides @Singleton fun bindsAppSettings(): AppSettings { return AppSettings() } @Provides @Singleton fun bindsAWFile(appSettings: AppSettings, context: Context): AWFile { return AWFile(appSettings, context) } }
现在应用可正常运行,关键两点:
- 在App模块的Dependencies中提供全局Context实例
- 将
AppSettings和Context作为bindsAWFile方法的参数,由Hilt自动注入后传递给AWFile构造器
总结
Hilt学习曲线较陡,通过调整依赖提供方式,利用构造注入结合模块参数传递,解决了非Activity类的依赖注入问题。
内容的提问来源于stack exchange,提问作者Diego Perez
相关产品推荐
相关产品推荐

