Hilt 使用
配置gradle
项目gradle
buildscript {
ext.kotlin_version = "1.3.72"
ext.hilt_version = '2.28-alpha'
repositories {
google()
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:4.0.1"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version"
}
}
app Gradle
apply plugin: 'kotlin-kapt'
apply plugin: 'dagger.hilt.android.plugin'
......
// Hilt dependencies
implementation "com.google.dagger:hilt-android:$hilt_version"
kapt "com.google.dagger:hilt-android-compiler:$hilt_version"
程序的入口
->@HiltAndroidApp
package top.zcwfeng.hilt
import android.app.Application
import dagger.hilt.android.HiltAndroidApp
@HiltAndroidApp
class App : Application(){
}
User 类
-> 默认构造方法 @Inject
package top.zcwfeng.hilt.model
import javax.inject.Inject
data class User(val name:String,val desc:String) {
@Inject
constructor():this(name = "David",desc = "一言难尽")
}
-> @AndroidEntryPoint
Activity
Fragment
View
Service
BroadcastReceiver
package top.zcwfeng.hilt
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.databinding.DataBindingUtil
import dagger.hilt.android.AndroidEntryPoint
import top.zcwfeng.hilt.databinding.ActivityMainBinding
import top.zcwfeng.hilt.model.User
import javax.inject.Inject
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject
lateinit var user: User
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val databinding: ActivityMainBinding =
DataBindingUtil.setContentView(this, R.layout.activity_main)
databinding.content.text = "${user.name}现在的心情是${user.desc}"
}
}
对应layout
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="user"
type="top.zcwfeng.hilt.model.User" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
其实就是使用各种的注解标签,如 @inject
通俗的依赖注入?
类里面的变量,成员等,就是这个类的依赖,就是类依赖成员
依赖注入,就是这个类,这些变量和成员,由外部进行初动态始化的
Hilt 有什么用?
依赖注入有什么用?
自动加载
自动加载的关键:实现了数据共享
不共享的数据需要依赖注入吗?
当然还是需要,私有的属性不需要,不想被共享的也需要共享
因为这种初始化过程比较复杂。为了比较方便
多个地方需要共享,多个地方用,这个时候用依赖注入比较适合
Hilt基于Dagger的
Dagger 为什么不好用
配置麻烦
依赖无法追踪(变量是怎么被注入的,注入的那些地方标记是啥)
新版AndroidStudio解决了
Hillt - Dagger 2 - koin
Dagger-Square-Google
Retrofit-Okhttp
Hilt-场景化 - Activity Fragment ViewModel View Application
Dagger 是依赖注入-ButterKnife (视图绑定,省代码的工具)
公司商业项目:Dagger
个人项目:Koin
1.性能 Dagger 好于koin 编译可能Dagger比较慢
2.依赖图的安全性 Dagger完备性完整,但是上手很难
3.依赖关系的追踪 As4.2支持类似继承实现关系。Koin还没有
Hilt 如何用,各种注解
详细使用,请参考官网,或者
https://dagger.dev/hilt/quick-start
更多信息参考