dependencies {
//导入dagger
implementation "com.google.dagger:dagger:2.12"
kapt "com.google.dagger:dagger-compiler:2.12"
}
/**
* Dagger2:依赖注入框架 依赖=创建实例+赋值变量
* 基本使用方法:1,@Module @Provides提供实例 或 @Inject标记数据类的构造方法
* 2,@Component 指定注入的目标类和提供实例对象的类
* 3,在目标类注册框架 指定赋值的变量
*/
class TestActivity : AppCompatActivity() {
@Inject //指定框架赋值的变量
lateinit var user: User
@Inject //指定框架赋值的变量
lateinit var user2: User2
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_test)
DaggerMyComponent.builder() //注册框架 注意加前缀Dagger DaggerMyComponent这个类由kapt框架编译时生成
.build()
.inject(this)
text.text = user.name //使用已赋值的变量
text2.text = user2.name
}
}
/**
* 职责:为框架指定注入的目标类和提供实例对象的类
*/
@Component(modules = arrayOf(MyModule::class))
interface MyComponent {
fun inject(activity: TestActivity) //这里有个坑 一定要指明具体注入的类 eg: activity:TestActivity 而不是 Activity
}
/**
* 职责:为框架提供实例对象
*/
@Module
class MyModule{
@Provides //提供实例
fun provideUser():User{
return User()
}
}
class User{
val name= "我是通过Module类传过来的"
}
/**
* @Inject->为框架指定创建实例的构造方法 若该构造方法有参数 则会在框架内继续寻找参数的实例或构造方法
*/
class User2 @Inject constructor() {
val name="我是通过Inject注释传过来的"
}