这里主要是看了扔物线的视频做的记录,我觉得讲得很好:朱凯《Hilt:Google 的依赖注入库终于达到了小白可用的级别》
官网教程:Hilt 应用类
网上很多教程,但是由于我是初学者,原本 android
开发也很一般,大部分都是看得我云里雾里。其实我很想知道在不使用这个的情况,和使用这个的情况。但是又想想,这是一个循序渐进的过程,生在这个时代是幸运的,别人都帮我们封装好了,上手就比较容易了,就像前端开发,也没使用原生 js
开发就进入了框架时代,一工作就是使用各种框架,虽然不是玩得很六,但是至少大部分都是可以自行完成的。所以想通了,立足于当下,先使用好当前的,慢慢的深入,不着急。
1. 项目引入
在项目下的 build.gradle
> buildscript
> dependencies
下:
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.31.2-alpha'
在 app
下的 build.gradle
中添加:
plugins {
...
id 'dagger.hilt.android.plugin'
id 'kotlin-android-extensions'
...
}
...
dependencies {
...
implementation "com.google.dagger:hilt-android:2.31.2-alpha"
kapt "com.google.dagger:hilt-android-compiler:2.31.2-alpha"
...
}
2. 准备工作
现在新建的项目我发现默认没有 Application
文件了。首先新建一个继承 Application
的类:
@HiltAndroidApp
class App: Application()
然后在 AndroidManifest.xml
文件中:
...
新建一个类 User
,我这里是用这个练习:
data class User (val name: String, val age: Int) {
@Inject constructor(): this("吴敬悦", 27)
}
3. 设置展示的视图
打开 activity_main.xml
文件,并修改文件,我就使用 TextView
显示上面的信息:
使用插件让编辑器帮我们自动创建视图 id
对应的变量,打开 app
>build.gradle
:
plugins {
...
id 'kotlin-android-extensions'
}
这样就可以直接在 Activity
中直接获取了。
text.text = "姓名:${user.name},年龄:${user.age}"
4. 在 Activity
中注入
package com.example.hiltapplication
import android.annotation.SuppressLint
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.android.synthetic.main.activity_main.*
import javax.inject.Inject
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject
lateinit var user: User
@SuppressLint("SetTextI18n")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
text.text = "姓名:${user.name},年龄:${user.age}"
}
}
5. 效果
6. 谈我的理解
这个感觉的确挺好的,我都不会实例化对象了,但是我写的这个很简单,其实还没有不写简单,只是不用实例化了,我想如果实例化的地方多了就真的方便了。当然 Hilt
还有共享的功能,如果标注为共享了,那么就相当于单例模式了,这样在一处修改,另外使用到的地方也修改了。
@Inject
代表关联实例化了,去哪里关联呢,就在 User
中的 @Inject
关联,android studio
中提供的有找到对应地方的方法,只不过需要你是高版本,具体什么版本我不知道,我的是 4.1
可以:
同样的在
User
哪里也可以看到有多少注入了它自身。
至于
@AndroidEntryPoint
我理解为,告诉编译器,这里需要特别处理。 @HiltAndroidApp
呢,我猜是跟上面一样,之所以要这样,我估计跟编译过程有关系,现在我还不懂,只能靠猜,所以只能跟着官网写,等使用一段时间以后才深究。 @ActivityScoped
就是跟共享相关了。