【Kotlin中使用Dagger2】基础入门篇(一)

Dagger2作为依赖注入神器相信很多朋友都听说过它的大名。只不过它的有些概念理解起来并不是那么清晰并且在使用的过程中也比较迷糊。我将把自身对Dagger2的理解、使用经验分享给大家希望对大家有所帮助。我将分几节详细介绍Dagger2在Kotlin在如何使用因为在Java中使用方式大同小异所以大家理解了Dagger2无论在Java还是Kotlin都能运用自如。

本节内容

这一小节我们先简单介绍一下Dagger2的基本使用主要包括

  • Dagger2环境配置
  • 依赖注入DI
  • @Inject
  • @Component

Dagger2环境配置

首先需要在Module中build.gradle引入插件Java中使用aptKotlin使用kapt

plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-kapt'
}

接下来引入依赖包和编译器

    implementation "com.google.dagger:dagger:2.32"
    kapt "com.google.dagger:dagger-compiler:2.32"

依赖注入

大家记住一点Dagger2是一个依赖注入框架它能做的事就是完成依赖注入。那么什么是依赖注入。我们通过两段代码直观的看一下。

第一种传统方式主动实例化

    lateinit var mPresenter:MainPresenter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        mPresenter = MainPresenter()
    }

可以看到成员变量mPresenter是通过构造方法直接实例化。

第二种通过注解注入实例化

    @Inject
    lateinit var mPresenter:MainPresenter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

可以看到这次我们没有调用构造方法而是在成员变量声明时添加了一个注解@Inject这样也能实例化成员变量mPresenter。后面大家会看当调用mPresenter时它并不为空说明我们实例化是成功的。

这就是两种实例化方式一种需要主动实例化一种是被动接收通过注解自动实例化。

@Inject

在上面我们看到注解@Inject能够实例化对象那它到底是什么

  • @Inject是Dagger2内置的一个注解
  • @Inject用来标注目标对象如上面的mPresenter
  • @Inject用来标注依赖类的构造方法如上面的MainPresenter

上面三点前两点都好理解第三点“标注依赖类的构造方法”是什么意思直接看代码

    class MainPresenter @Inject constructor() {
        fun doSomething():String{
            return "This is result"
        }
    }

可以看到我们定义了一个类MainPresenter在它的构造方法上添加了@Inject注解由于有注解出现显示无参构造器constructor同时定义了一个方法doSomething返回一个字符串。

为什么需要在MainPresenter构造方法上添加@Inejct大家看下mPresenter的类型是不是MainPresenter。这就告诉编译器MainPresenter可通过Dagger2注入到目标类为MainPresenter类型的变量通过构造方法实例化。

@Component

现在我们有@Inject标注的目标类也有@Inject标注的依赖构造方法那它们是不是就可以直接实例化了答案是否定的它们现在是独立的并不知道对方的存在如何将它们联系起来 那就需要一个桥梁—Component把依赖类连接到目标类。

首先我们看一下Component如何声明

    @Component
    interface MainComponent {
        fun inject(activity:MainActivity)
    }

可以看到我们定义了一个接口(必须是接口或抽象类)使用@Component进行标注同时提供了一个方法inject。inject中的参数就是我们需要注入开始的类。

OK现在我们桥梁Component也有了如何让桥梁起作用。编译一下编译一下编译一下说三遍。编译完成后会生成一个以“Dagger”开头的Component文件如DaggerMainComponent接下来咱们使用一下

    class MainActivity : AppCompatActivity() {

        @Inject
        lateinit var mPresenter:MainPresenter

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)

            initInjection()
   
            mClickBtn.setOnClickListener {
                toast(mPresenter.doSomething())
            }
        }

        /*
            Dagger2注入注册
         */
        private fun initInjection() {
            DaggerMainComponent.builder().build().inject(this)

        }
    }

可以看到要想桥梁起作用需要调用DaggerMainComponent的inject方法进行“注册”。
以上代码在使用mPresenter之前需要Dagger2注册其中有一个按钮点击的话会弹一个Toast,内容就是mPresenter的返回值。如果mPresenter为空肯定报异常了。如果一切正常说明注入是成功的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄毛火烧雪下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值