今天繼續Jetpack專題,相信不少的朋友都使用過Dagger,也放棄過Dagger,因為實在太難用了,所以官方也是為了讓我們更好使用依賴注入框架,為我們封裝了一個新的框架——Hilt,今天一起來看看:
- 依賴注入是啥?為什么需要她?
- Hilt是啥,怎么用?
- Hilt支持哪些類的依賴注入,
依賴注入是啥?為什么需要她?
簡單的說,依賴注入就是內部的類在外部實體化了,也就是不需要自己去做實體化作業了,而是交給外部容器來完成,最后注入到呼叫者這邊,形成依賴注入,
舉個例子:
Activity中有一個user類,正常情況下要使用這個user肯定是需要實體化它,不然他是個空值,但是用了依賴注入后,就不需要在Activity內部再去實體化,就可以直接使用它了,
@AndroidEntryPoint
class MainActivity : BaseActivity() {
@Inject
lateinit var user: User
}
這個user就可以直接使用了,是不是有點神奇,都不需要手動依賴了,當然代碼沒寫完,后面再去完善,只是表達了這么一個意思,也就是依賴注入的含義,
那么這種由外部容器來實體化物件的方式到底有什么好處呢?最大的好處就是減少了手動依賴,對類進行了解耦,具體主要有以下幾點:
- 依賴注入庫會自動釋放不再使用的物件,減少資源的過度使用,
- 在配置
scopes范圍內,可重用依賴項和創建的實體,提高代碼的可重用性,減少了很多模板代碼, - 代碼變得更具可讀性,
- 易于構建物件,
- 撰寫低耦合代碼,更容易測驗,
Hilt是啥,怎么用?
很明顯,Hilt就是一個依賴注入庫,一個封裝了Dagger,在Dagger的基礎上進行構建的一個依賴注入庫,Dagger我們都知道是一個早期的依賴注入庫,但確實不好用,需要配置很多東西,那么Hilt簡單到哪了呢?我們繼續完善上面的例子:
@HiltAndroidApp
public class MainApplication extends Application {
}
@AndroidEntryPoint
class HiltActivitiy : AppCompatActivity() {
@Inject
lateinit var user: UserData
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
showToast(user.name)
}
}
data class UserData(var name: String) {
@Inject
constructor() : this("bob")
}
說下幾個注釋的含義:
@HiltAndroidApp,所有使用Hilt的App必須包含一個使用 @HiltAndroidApp 注解的 Application,相當于Hilt的初始化,會觸發Hilt代碼的生成,@AndroidEntryPoint,用于提供類的依賴,也就是代表這個類會用到注入的實體,@Inject,這個注解是用來告訴 Hilt 如何提供該類的實體,它常用于建構式、非私有欄位、方法中,
Hilt支持哪些類的依賴注入,
1) 如果是 Hilt 支持的 Android 組件,直接使用 @AndroidEntryPoint注解即可,比如Activity,Fragment,Service等等,
- 如果是
ComponentActivity的子類Activity,那么直接使用@AndroidEntryPoint就可以了,比如上面的例子, - 如果是其他的Android類,必須在它依賴的Android類添加同樣的注解,例如在 Fragment 中添加
@AndroidEntryPoint注解,必須在Fragment依賴的Activity上也添加@AndroidEntryPoint注解,
2)如果是需要注入第三方的依賴,可以使用@Module注解,使用 @Module注解的普通類,在其中創建第三方依賴的物件,比如獲取okhttp的實體
@Module
@InstallIn(ApplicationComponent::class)
object NetworkModule {
/**
* @Provides
* @Singleton 提供單例
*/
@Provides
@Singleton
fun provideOkHttpClient(): OkHttpClient {
return OkHttpClient.Builder()
.build()
}
}
這里又有幾個新的注解了:
@Module,用于創建依賴類的物件@InstallIn,使用 @Module 注入的類,需要使用 @InstallIn 注解指定 module 的范圍,例如使用 @InstallIn(ActivityComponent::class) 注解的 module 會系結到 activity 的生命周期上,@Provides,用于被 @Module注解標記類的內部的方法,并提供依賴項物件,@Singleton,提供單例
3)為ViewModel提供的專門的注解
@ViewModelInject,在Viewmodel物件的建構式中使用 @ViewModelInject 注解可以提供一個 ViewModel,
class HiltViewModel @ViewModelInject constructor() : ViewModel() {}
private val mHitViewModule: HiltViewModel by viewModels()
參考
https://juejin.im/post/6844904198803292173
拜拜
有一起學習的小伙伴可以關注下??我的公眾號——碼上積木,每天剖析一個知識點,我們一起積累知識,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/203336.html
標籤:其他
