Dagger2
。它能很好帮咱们解耦各个模块之间的强关联性,提升项目的健壮性。可是它的羞涩难懂,难用着实吓退了很多人。为了提升易用性,此次谷歌推出了
Dagger Hilt
。
Dagger2
。而后就是此次新推出的
Dagger Hilt
。
这里有关于依赖注入的Google官方的视频,你们也能够看一下。
哔哩哔哩:www.bilibili.com/video/BV1wJ…android
在模块的build.gradle
中加入下列依赖。git
apply plugin: 'dagger.hilt.android.plugin'
apply plugin: 'kotlin-kapt'
dependencies {
implementation 'com.google.dagger:hilt-android:2.28-alpha'
kapt 'com.google.dagger:hilt-android-compiler:2.28-alpha'
}
复制代码
而后在项目的build.gralde
中加入下面classpath
。github
buildscript {
dependencies {
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.28-alpha'
}
}
复制代码
若是是在Daager2
的话,须要Application继承DaggerApplication
,而且还须要建立Application的Module
,甚是麻烦。
可是此次只要使用@HiltAndroidApp
的注解就能够完成对Application的依赖注入。剩下的部分框架会为咱们解决。app
@HiltAndroidApp
class App : Application() {
}
复制代码
Hilt
为了方便咱们使用提早定义了好多组件的LifeCycle
。以下:框架
Application
Activity
ActivityRetained
Fragment
Service
View
ViewWithFragment
之前咱们须要本身管理,可是此次只要使用@InstallIn
的注解,就能够委托Hilt
帮咱们管理,能够省去不少麻烦。固然在这里也可使用@Provide
注解。jvm
@Module
@InstallIn(ApplicationComponent::class)
class ApplicationModule {
@AppHash
@Provides
fun provideHash(): String {
return hashCode().toString()
}
}
复制代码
这里的@AppHash
是自定义注解,跟Dagger2
的用法是同样的。maven
@Qualifier
@Retention(AnnotationRetention.RUNTIME)
internal annotation class AppHash
复制代码
在Dagger2
中,对Activity和Fragment的注入依赖的使用方法异常复杂,让人抓耳挠腮。尤为是新增一个Activity或Fragment时常常忘了添加依赖。
可是在Hilt
中为咱们简化了这一个过程,只须要@AndroidEntryPoint
的注解。至关于以前的@ContributesAndroidInjector
。ide
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
@JvmField
@ActivityHash
@Inject
var hash: String? = null
private val viewModel by viewModels<MainViewModel>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
textView.text = hash
Log.d("MainActivity", viewModel.getRepositoryString())
}
}
复制代码
在这里为你们讲几个额外的知识点。post
若是要注入的类型包含空,即像上述代码var hash:String? = null
时,须要添加@JvmField
注解。测试
@JvmField
@ActivityHash
@Inject
var hash: String? = null
复制代码
若是只是String类型则不须要。
@ActivityHash
@Inject
lateinit var hash: String
复制代码
若是是正常的生成ViewModel的是方法是使用ViewModelProviders
。可是这些代码太过于样板代码,写起来毫无心义。这个时候为了简化这些样板代码就可使用Activity
和Fragment
的KTX
。
首先把Activity
和Fragment
的KTX
的库引入到项目中。
def activity_version = "1.1.0"
def fragment_version = "1.2.4"
implementation "androidx.activity:activity-ktx:$activity_version"
implementation "androidx.fragment:fragment-ktx:$fragment_version"
复制代码
还须要设置jvmTarget
。
kotlinOptions {
jvmTarget = "1.8"
}
复制代码
在Activity中:
// 获取ActivityScope的ViewModel
private val viewModel by viewModels<MainViewModel>()
复制代码
在Fragment中:
// 获取ActivityScope的ViewModel
private val viewModel: MainViewModel by activityViewModels()
// 获取FragmentScope的ViewModel
private val viewModel: MainViewModel by viewModels()
复制代码
只要使用Hilt
的@ViewModelInject
的注解,框架不只为咱们解决生成问题,还帮咱们解决Lifecycle问题。可算是进一步减小了样板代码的存在。
首先开始以前咱们须要添加一下关于ViewModel-lifecycle的库。
dependencies {
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0'
implementation 'androidx.lifecycle:lifecycle-viewmodel-savedstate:2.2.0'
implementation 'androidx.hilt:hilt-common:1.0.0-SNAPSHOT'
implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-SNAPSHOT'
kapt 'androidx.hilt:hilt-compiler:1.0.0-SNAPSHOT'
}
复制代码
由于这里咱们使用了SNAPSHOT,因此咱们还须要添加repository的路径。
allprojects {
repositories {
maven {
url "https://androidx.dev/snapshots/builds/6543454/artifacts/repository/"
}
}
}
复制代码
下面就是关于ViewModel
的代码。
class MainViewModel @ViewModelInject constructor(
private val repository: SampleRepository,
@Assisted private val savedState: SavedStateHandle
) : ViewModel() {
fun getRepositoryString(): String = repository.toString()
}
复制代码
这里的SampleRepository
是也是用Hilt
生成的,下面会有讲到。
还有@Assisted
的注解是为了注入SavedStateHandle
。这里就对SavedStateHandle
的用途就不叙述了,不懂的小伙伴搜一搜资料了解一下。之后有机会的话会出关于它的教程。
关于Singleton
的用法跟Dagger2
是彻底同样的。怕有人不知道,简单解释一下Singleton
就是单例生成,全程持有一个单例,再也不额外生成。
关于Singleton
的用法参考下面的代码。
@Singleton
class SampleRepository @Inject constructor() {
}
复制代码
让我感叹一下,对比以前的Dagger2
用法的羞涩难懂,Dagger Hilt
真是好用啊。不只减小了不少样板代码,并且还帮咱们管理各个组件的Lifecycle。若是你们有机会必定要尝试尝试!
Github:github.com/HyejeanMOON…
其余教程:
Android10的分区存储机制(Scoped Storage)适配教程:juejin.im/post/5ec005…
Android Jetpack Room的详细教程: juejin.im/post/5ebac9…
Android的属性动画(Property Animation)详细教程: juejin.im/post/5eb7a5…
Android ConstraintLayout的易懂教程: juejin.im/post/5ea50a…
在RecyclerView中能够应对多个ViewType的库--Groupie: juejin.im/post/5e9059…
Google的MergeAdapter的使用: juejin.im/post/5e903f…
Paging在Android中的应用: juejin.im/post/5e75db…
Android UI测试之Espresso: juejin.im/post/5e6caa…
Android WorkManager的使用: juejin.im/post/5e635e…