簡體   English   中英

@IntoMap @Binds如何與Dagger一起使用?

[英]How @IntoMap @Binds exactly works with Dagger?

我使用的是Dagger ,我想將Repository @injectViewModel因此我創建了一個抽象模塊,用於在其中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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM