[英]How @IntoMap @Binds exactly works with Dagger?
我使用的是Dagger
,我想將Repository
@inject
到ViewModel
因此我創建了一個抽象模塊,用於在其中Map
存儲庫類:
我的抽象模塊:
@Module
abstract class RepositoryModule{
@Binds
@IntoMap
@ClassKey(RepositoryStatus::class)
abstract fun provideRepositoryStatus(repositoryStatus: RepositoryStatus): RepositoryStatus
}
我的ViewModel
模塊,其中包括RespositoryModule
:
@Module(includes = [
RepositoryModule::class
])
abstract class ViewModelModule {
@Binds
@IntoMap
@ViewModelKey(MainViewModel::class)
abstract fun bindsMainViewModel(viewModel: MainViewModel): ViewModel
}
我不知道這是如何工作的,為什么Dagger知道我有一個地圖並將其與ViewModel
綁定? 因為我從不使用該方法。 而且我在圖中包含了一張地圖,因此除非我稱呼它,否則我將無法使用它。
@Binds
類似於@Provides
,只有它被用於提供被擴展接口,抽象類或在您的案件類別。 因此,無需進行任何配置,並且@Provides
調用是不必要的。
@IntoMap
用作put
密鑰放入地圖的命令,在這種情況下,密鑰由@ClassKey
或@ViewModelKey
提供,而值由@Binds
提供。
還請檢查文檔,因為我的解釋是針對您的具體情況的。 但這是基本的。 從Daggers Javadoc:
@Binds
注釋委派綁定的模塊的抽象方法。 例如,要將Random綁定到SecureRandom,模塊可以聲明以下內容:@Binds abstract Random bindRandom(SecureRandom secureRandom); @Binds方法替代了Provides方法,這些方法僅返回注入的參數。 首選@Binds,因為生成的實現可能更有效。
@IntoMap
方法的返回類型形成Map>的值的類型參數,並且帶注釋的鍵和返回值的組合作為鍵/值對貢獻給映射。 由值的累積產生的Map>將是不可變的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.