今天繼續Jetpack專題,相信很多的朋友都使用過Dagger,也放棄過Dagger,由於實在太難用了。因此官方也是爲了讓咱們更好使用依賴注入框架,爲咱們封裝了一個新的框架——Hilt,今天一塊兒來看看:web
-
依賴注入是啥?爲何須要她? -
Hilt是啥,怎麼用? -
Hilt支持哪些類的依賴注入。
依賴注入是啥?爲何須要她?
簡單的說,依賴注入就是內部的類在外部實例化了。也就是不須要本身去作實例化工做了,而是交給外部容器來完成,最後注入到調用者這邊,造成依賴注入。微信
舉個例子:Activity中有一個user類,正常狀況下要使用這個user確定是須要實例化它,否則他是個空值,可是用了依賴注入後,就不須要在Activity
內部再去實例化,就能夠直接使用它了。框架
@AndroidEntryPoint
class MainActivity : BaseActivity() {
@Inject
lateinit var user: User
}
這個user
就能夠直接使用了,是否是有點神奇,都不須要手動依賴了,固然代碼沒寫完,後面再去完善。只是表達了這麼一個意思,也就是依賴注入
的含義。編輯器
那麼這種由外部容器來實例化對象的方式到底有什麼好處
呢?最大的好處就是減小了手動依賴,對類進行了解耦。具體主要有如下幾點:ide
-
依賴注入庫會自動釋放再也不使用的對象,減小資源的過分使用。 -
在配置 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")
}
說下幾個註釋的含義:post
-
@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的實例flex
@Module
@InstallIn(ApplicationComponent::class)
object NetworkModule {
/**
* @Provides
* @Singleton 提供單例
*/
@Provides
@Singleton
fun provideOkHttpClient(): OkHttpClient {
return OkHttpClient.Builder()
.build()
}
}
這裏又有幾個新的註解了:ui
-
@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
點點在看你最好看
本文分享自微信公衆號 - 碼上積木(Lzjimu)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。