Kotlin+Dagger注入构造函数使用困惑,求技术指导
嘿,我来帮你搞懂怎么用这个带@Inject构造函数的类!其实核心是:你不能直接用new来创建这个类的实例,得靠依赖注入(DI)框架(比如Hilt、Dagger)来帮你处理依赖的创建和注入。下面我用最常用的两种框架给你举例子:
用Hilt(Android官方推荐)
Hilt是Google推出的基于Dagger的简化DI框架,用起来更省心:
先配置Hilt(如果还没配的话)
确保你的项目级build.gradle和app级build.gradle已经添加了Hilt的插件和依赖(核心是加插件声明和依赖项)。给Application类加注解
所有Hilt的注入都需要一个带@HiltAndroidApp的Application类:@HiltAndroidApp class MyApplication : Application()别忘了在
AndroidManifest.xml里把这个Application设置为你的应用入口。在需要使用的地方注入类
比如你要在Activity里用ClassWithInjectedConstructor,给Activity加@AndroidEntryPoint,然后用@Inject lateinit var声明变量:@AndroidEntryPoint class MainActivity : AppCompatActivity() { // 让Hilt自动注入这个实例 @Inject lateinit var myClassInstance: ClassWithInjectedConstructor override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 现在可以直接用这个实例了 val result = myClassInstance.check() // 做你想做的操作,比如打印结果 } }
用Dagger2(更基础的DI框架)
如果你用的是原生Dagger2,步骤稍微多一点,但逻辑是一样的:
确保依赖类可被DI创建
你的SimpleInjectedObject也需要让Dagger能创建它,要么给它加@Inject构造函数:class SimpleInjectedObject @Inject constructor() { fun methodToCall(): Int { return 42 // 这里写你的实际逻辑 } }创建Component接口
Component是Dagger用来连接依赖和注入目标的桥梁:@Component interface MyComponent { // 声明要注入的目标(比如Activity) fun inject(activity: MainActivity) // 或者直接提供类的实例 fun getClassInstance(): ClassWithInjectedConstructor }在目标类里初始化Component并注入
在Activity里创建Dagger自动生成的Component实例,然后调用inject方法:class MainActivity : AppCompatActivity() { @Inject lateinit var myClassInstance: ClassWithInjectedConstructor override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 创建Dagger生成的Component实例 val component = DaggerMyComponent.create() // 注入到当前Activity component.inject(this) // 现在可以使用实例了 val result = myClassInstance.check() } }
关键逻辑说明
为什么不能直接new?因为ClassWithInjectedConstructor的构造函数需要SimpleInjectedObject的实例,DI框架会帮你自动创建这个依赖实例,再把它传入构造函数,最后把组装好的ClassWithInjectedConstructor实例交给你——你不用手动管理依赖的创建,这就是依赖注入的核心好处。
内容的提问来源于stack exchange,提问作者MickeyThreeSheds

