Jetpack 新成员 Hilt
引用HiDhl的Hilt
1.作用:依赖注入
2.为什么要使用依赖注入
- 依赖注入库会自动释放不再使用的对象,减少资源的过度使用。
- 在配置 scopes 范围内,可重用依赖项和创建的实例,提高代码的可重用性,减少了很多模板代码。
- 代码变得更具可读性。
- 易于构建对象。
- 编写低耦合代码,更容易测试。
3.依赖注入常用的注解
- @HiltAndroidApp
1.所有使用 Hilt 的 App 必须包含一个使用 @HiltAndroidApp 注解的 Application。
2.@HiltAndroidApp 注解将会触发 Hilt 代码的生成,作为应用程序依赖项容器的基类。 - @AndroidEntryPoint
Hilt 提供的 @AndroidEntryPoint 注解用于提供 Android 类的依赖(Activity、Fragment、View、Service、BroadcastReceiver)特殊的 Application 使用 @HiltAndroidApp 注解。
1.Activity:仅仅支持 ComponentActivity 的子类例如 FragmentActivity、AppCompatActivity 等等。
2.Fragment:仅仅支持继承 androidx.Fragment 的 Fragment
注:如果Fragment使用了@AndroidEntryPoint,那么包含他的antivity必须也要使用@AndroidEntryPoint。 - @Inject
Hilt 需要知道如何从相应的组件中提供必要依赖的实例。使用 @Inject 注解来告诉 Hilt 如何提供该类的实例,它常用于构造函数、非私有字段、方法中。 - @Module
常用于创建依赖类的对象(例如第三方库 OkHttp、Retrofit等等),使用 @Module 注解的类,需要使用 @InstallIn 注解指定 module 的范围。 - @InstallIn
使用 @Module 注入的类,需要使用 @InstallIn 注解指定 module 的范围,例如使用 @InstallIn(ActivityComponent::class) 注解的 module 会绑定到 activity 的生命周期上。 - @Provides
它常用于被 @Module 注解标记类的内部的方法,并提供依赖项对象。 - @EntryPoint
- @Singleton
提供单例
4.如何使用 Hilt
- 首先在 project 的 build.gradle 添加以下依赖。
buildscript {
...
dependencies {
...
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.28-alpha'
}
}
- 然后在 App 模块中的 build.gradle 文件中添加以下代码。
...
apply plugin: 'kotlin-kapt'
apply plugin: 'dagger.hilt.android.plugin'
android {
...
}
dependencies {
implementation "com.google.dagger:hilt-android:2.28-alpha"
kapt "com.google.dagger:hilt-android-compiler:2.28-alpha"
}
- Hilt 使用 Java 8 的功能,所以要在项目中启用 Java 8,需要在 App 模块的 build.gradle 文件中,添加以下代码
android {
...
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
// For Kotlin projects
kotlinOptions {
jvmTarget = "1.8"
}
}
- Application 是 App 的入口,所以所有使用 Hilt 的 App 必须包含一个使用 @HiltAndroidApp 注解的 Application
@HiltAndroidApp
class HiltApplication : Application() {
}
5.Hilt 如何和第三方组件一起使用
@Module
@InstallIn(ApplicationComponent::class)
object NetworkModule {
@Provides
@Singleton
fun provideOkHttpClient(): OkHttpClient {
return OkHttpClient.Builder()
.build()
}
@Provides
@Singleton
fun provideRetrofit(okHttpClient: OkHttpClient): Retrofit {
return Retrofit.Builder()
.client(okHttpClient)
.baseUrl("192.168.55.12:8080/gtc")
.addConverterFactory(GsonConverterFactory.create())
.build()
}
@Provides
@Singleton
fun provideGitHubService(retrofit: Retrofit): HttpService {
return retrofit.create(HttpService ::class.java)
}
}
6.Hilt 如何和 ViewModel 一起使用
- 在 App 模块中的 build.gradle 文件中添加以下代码。
implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha01'
kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha01'
- activity使用注解
class MainActivity : AppCompatActivity() {
//by viewModels()需要添加库
//implementation 'androidx.activity:activity-ktx:1.2.0-beta01'
private val mHitViewModule: HiltViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mHitViewModule.mHitLiveData.observe(this, Observer {
println("$it 飞起来吧")
})
}
}
- viewmodel
class HiltViewModel @ViewModelInject constructor():ViewModel() {
//使用liveData需要添加库
//implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.3.0-beta01'
val mHitLiveData = liveData {
emit(" i am a ViewModelInject")
}
}
7.Hilt 如何和 Room 一起使用
@Module
@InstallIn(ApplicationComponent::class)
object RoomModule {
@Provides
@Singleton
fun provideAppDataBase(application: Application): AppDataBase {
return Room
.databaseBuilder(application, AppDataBase::class.java, "jwxt.db")
.fallbackToDestructiveMigration()
.allowMainThreadQueries()
.build()
}
@Provides
@Singleton
fun providePersonDao(appDatabase: AppDataBase): PersonDao {
return appDatabase.personDao()
}
}