简体   繁体   English

多模块项目 - Dagger

[英]Multimodule project - Dagger

In my Android project I have my:在我的 Android 项目中,我有我的:

  • core library module核心库模块
  • ui_add_credit_card library module ui_add_credit_card库模块
  • app as application module应用程序作为应用程序模块

In the core an AppComponent is defined:核心中定义了一个AppComponent

@Singleton
@Component(
        modules = {
                AppModule.class,
                NetworkModule.class,
                ViewModelFactoryModule.class,
        }
)
public interface AppComponent {

and a special module for ViewModules that is bind module ViewModelFactoryModule :和一个特殊的 ViewModules 模块是绑定模块ViewModelFactoryModule

@Module
abstract class ViewModelFactoryModule {

    @Binds
    abstract fun bindViewModelFactory(viewModelFactory: DaggerViewModelFactory): ViewModelProvider.Factory

    @Binds
    @IntoMap
    @ViewModelKey(SplashViewModel::class)
    abstract fun bindSplashViewModel(viewModel: SplashViewModel): ViewModel
...

DaggerViewModelFactory is a special ViewModelProvider.Factory that will take care of ViewModel key naming so injecting Activities/Fragments don't need to care about it: DaggerViewModelFactory是一个特殊的 ViewModelProvider.Factory 将负责 ViewModel 键命名,因此注入活动/片段不需要关心它:

class DaggerViewModelFactory @Inject constructor(
        private val creators: Map<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>
) : ViewModelProvider.Factory {

    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        val creator = creators[modelClass] ?: creators.entries.firstOrNull {
            modelClass.isAssignableFrom(it.key)
        }?.value ?: throw IllegalArgumentException("unknown model class $modelClass")
        try {
            @Suppress("UNCHECKED_CAST")
            return creator.get() as T
        } catch (e: Exception) {
            throw RuntimeException(e)
        }    }
}

That all works fine:)一切正常:)

The problem is when I want to create additional AddCreditCardComponent and AddCreditCardViewModelModule for separate project module ui_add_credit_card .问题是当我想为单独的项目模块ui_add_credit_card创建额外AddCreditCardComponentAddCreditCardViewModelModule时。

@Component(
        dependencies = [AppComponent::class],
        modules = [
            AddCreditCardViewModelModule::class
        ])
interface AddCreditCardComponent {

    fun inject(creditCardRegisterActivity: CreditCardRegisterActivity)
}
@Module
abstract class AddCreditCardViewModelModule {

    @Binds
    @IntoMap
    @ViewModelKey(CreditCardViewModel::class)
    abstract fun bindCreditCardRegistrationViewModel(
            viewModel: CreditCardRegistrationViewModel
    ): ViewModel

}

I get the following error:我收到以下错误:

AddCreditCardComponent.java:8: error: [Dagger/MissingBinding] androidx.lifecycle.ViewModelProvider.Factory cannot be provided without an @Provides-annotated method. AddCreditCardComponent.java:8:错误:[Dagger/MissingBinding] androidx.lifecycle.ViewModelProvider.Factory 不能在没有 @Provides 注释的方法的情况下提供。

Any help?有什么帮助吗? I assumed ViewModelProvider.Factory should be provided by my ViewModelFactoryModule but it doesn't happen:(我认为 ViewModelProvider.Factory 应该由我的ViewModelFactoryModule提供,但它没有发生:(

I managed to solve my issue by creating module AddCreditCardViewModelModule in a different way (@Provide instead of @Binds) and I had to create specialized ViewModel.Factory that will care about added ViewModel instantiation.我设法通过以不同的方式(@Provide 而不是@Binds)创建模块AddCreditCardViewModelModule来解决我的问题,并且我必须创建专门的 ViewModel.Factory 来关心添加的 ViewModel 实例化。

@Module
object AddCreditCardViewModelModule {

    @JvmStatic @Provides
    fun provideAddCreditCardViewModelFactory(
            adyenApi: AdyenApi,
            paymentController: PaymentController
    ) = AddCreditCardViewModelFactory(adyenApi, paymentController)

}

also (thx to David Medenjak ) it was crucial to make sure dependencies (eg AdyenApi ) from AppComponent are exposed as a "getter".另外(感谢 David Medenjak )确保来自AppComponent的依赖项(例如AdyenApi )作为“getter”公开是至关重要的。 Otherwise AddCreditCardComponent won't have access to it.否则AddCreditCardComponent将无权访问它。

Cheers!干杯!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM