为什么使用依赖注入?
- 因为我们每天都在用,构造方法、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 绑定生命周期 是由我们自己决定的
- 是否要注意到混淆? 待分析