Hilt依赖注入

1,125 阅读2分钟

为什么使用依赖注入?

  • 因为我们每天都在用,构造方法、builder、单例都是依赖注入
  • 由外界初始化的方式,供View来使用的方式的,其实都叫做依赖注入

好处?

  • 实现了范围内的资源共享、对象共享
  • 不用到处写初始化
  • 自动加载方便了数据共享

我们应该使用依赖注入么

  • 当然
  • 每天都在用
  • 例如强转Activity去拿里面的数据

怎么用

  • Project下面的build.gradle引入
        classpath 'com.google.dagger:hilt-android-gradle-plugin:2.28-alpha'

  • app下面的build.gradle引入

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

implementation 'com.google.dagger:hilt-android:2.28-alpha'
    kapt 'com.google.dagger:hilt-android-compiler:2.28-alpha'
  • 给Application添加注解@HiltAndroidApp
@HiltAndroidApp
class HiltApplication : Application() {
}
  • Model类外面添加共享范围,例如@ActivityScope
@ActivityScoped
data class User constructor(var name: String, var mode: String) {
    @Inject constructor() : this("Fage", "不开心了")
}

  • Model中需要共享的构造方法添加注入的注解@Inject

  • Activity中使用@Inject 对属性对象懒加载声明 例如 @Inject lateinit var user: User()

package com.example.databidingandhiltdemo

import android.annotation.SuppressLint
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.example.databidingandhiltdemo.databinding.ActivityMainBinding
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {

    @Inject lateinit var user: User

    @SuppressLint("SetTextI18n")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        user.mode = "开心了"
    }
}
  • Activity类外面要使用 @AndroidEntryPoint注解来表示这个类需要共享@Inject对象
  • Activity下面的子View需要共享的时候怎么写?
package com.example.databidingandhiltdemo

import android.content.Context
import android.util.AttributeSet
import androidx.appcompat.widget.AppCompatTextView
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject

@AndroidEntryPoint
class UserView(context: Context, attrs: AttributeSet?) : AppCompatTextView(context, attrs) {
    @Inject lateinit var user: User

    override fun onAttachedToWindow() {
        super.onAttachedToWindow()

        text = "${user.name}的心情是${user.mode}"
    }
}

Hit基于Dagger,那么为什么Dagger那么难用呢?

  • 配置比较麻烦

Hit为什么好用?

  • 做了简化
  • 针对Android的场景,进行了特殊定制
  • 新版的Android Studio 4.2 是可以追踪到依赖的

Hilt的使用场景分析

总结

  • 怎么用:各种注解即可
  • 难用么?不难用
  • 什么时候需要使用依赖注入? UI下面的对象共享
  • 老项目是否需要改造? 根据需要慢慢改造即可
  • 会增加编译时间的,第一遍会增加
  • 对象生命周期是怎么样的? 和 MainActivity 绑定生命周期 是由我们自己决定的
  • 是否要注意到混淆? 待分析