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

Kotlin+Dagger注入构造函数使用困惑,求技术指导

怎么使用带@Inject构造函数的Kotlin类

嘿,我来帮你搞懂怎么用这个带@Inject构造函数的类!其实核心是:你不能直接用new来创建这个类的实例,得靠依赖注入(DI)框架(比如Hilt、Dagger)来帮你处理依赖的创建和注入。下面我用最常用的两种框架给你举例子:

用Hilt(Android官方推荐)

Hilt是Google推出的基于Dagger的简化DI框架,用起来更省心:

  1. 先配置Hilt(如果还没配的话)
    确保你的项目级build.gradle和app级build.gradle已经添加了Hilt的插件和依赖(核心是加插件声明和依赖项)。

  2. 给Application类加注解
    所有Hilt的注入都需要一个带@HiltAndroidApp的Application类:

    @HiltAndroidApp
    class MyApplication : Application()
    

    别忘了在AndroidManifest.xml里把这个Application设置为你的应用入口。

  3. 在需要使用的地方注入类
    比如你要在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,步骤稍微多一点,但逻辑是一样的:

  1. 确保依赖类可被DI创建
    你的SimpleInjectedObject也需要让Dagger能创建它,要么给它加@Inject构造函数:

    class SimpleInjectedObject @Inject constructor() {
        fun methodToCall(): Int {
            return 42 // 这里写你的实际逻辑
        }
    }
    
  2. 创建Component接口
    Component是Dagger用来连接依赖和注入目标的桥梁:

    @Component
    interface MyComponent {
        // 声明要注入的目标(比如Activity)
        fun inject(activity: MainActivity)
        // 或者直接提供类的实例
        fun getClassInstance(): ClassWithInjectedConstructor
    }
    
  3. 在目标类里初始化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:40:45