android經典簡單小項目 android開發三大框架哪個用的多


Dagger 和 Koin 無疑是 Android 中最流行的兩個依賴注入框架 。這兩個庫具有相同的用途,而且看起來非常相似,但它們在底層的工作方式卻非常不同 。
那么 Hilt 是什么呢?Hilt 是一個內部使用 Dagger 的庫,只是簡化了它的用法,因此我在這里所說的有關 Dagger 的內容也適用于 Hilt 。在本文中,我不會告訴您應該選擇哪個庫 。相反,我想向您展示它們的本質區別以及這些差異對您的應用造成的影響 。
Dagger 如果我們希望 Dagger 提供某個類的實例,我們要做的就是在構造函數中添加 @Inject 注解 。
添加這個注解后,Dagger 會在構建時為這個類生成一個 Factory 。在該用例下,由于它的類名是 CompositeAdapter, 它會生成一個名為 CompositeAdapter**_**Factory的類 。
此類包含創建 CompositeAdapter 類的實例所需的所有信息 。
如你所看到該工廠類實現了 get() 并返回了一個新的 CompositeAdapter 實例 。這實際上是此類實現的 Provider 接口中指定的方法 。其他類可以使用 Provider 接口來獲取一個類的實例 。
如果我們用 Hilt 代替 Dagger 呢? 在這個例子中,沒有任何區別 。Hilt 是一個內部使用 Dagger 的庫,我向你展示的類是由 Dagger 生成的 。如果您使用 Hilt,它確實為我們生成了一些額外的類,這些類簡化了 Dagger 的使用,并減少了我們需要編寫的樣板代碼的數量 。但核心部分保持不變 。
Koin Koin 與 Dagger 以及 Hilt 相比,管理依賴項的方法完全不同 。要在 Koin 中注冊依賴項,我們不會使用任何注解,因為Koin不會生成任何代碼 。相反,我們必須為模塊提供工廠,這些模塊將用于創建項目中所需的每個類的實例 。
Koin 將這些工廠類的引用添加到 InstancesRegistry 類中,該類包含對我們編寫的所有工廠的引用 。
該 map 中的 key 是類的全名或使用命名參數時提供的名稱 。對應的值是我們編寫的工廠,將用于創建類的實例 。
要獲得依賴關系,我們需要調用 get() (比如在一個工廠類中) 或者通過在 activities 或 fragments 中調用 inject() 委托屬性,從而懶加載 get() 。get()方法將查找為給定類型的類注冊工廠,并將其注入其中 。
有什么影響? Dagger 生成代碼來提供依賴,而 Koin 不生成代碼,這實際上帶來了一些影響 。
1. 錯誤處理
因為Dagger 是一個編譯時依賴注入框架,如果我們忘記提供某些依賴,我們幾乎會立即知道我們的錯誤,因為我們的項目將構建失敗 。
例如,如果我們忘記向構造函數的 CompositeAdapter 中添加 @Inject 注解,并嘗試將其注入 fragment 中,則構建將失敗,并顯示適當的錯誤,確切地告訴我們出了什么問題 。
在 Koin 中的情況有所不同,因為它不會生成任何代碼 。如果我們忘記為 CompositeAdapter 類添加工廠,應用將會成功構建,但是會拋出 RuntimeException 一旦我們請求獲取這個類的實例 。它可能會在應用啟動時發生,因此我們可能會立即注意到它,但也可能稍后在其他屏幕上或當用戶執行某些特定操作時發生 。

猜你喜歡