多模块项目 - Dagger

Multimodule project - Dagger

在我的 Android 项目中我有我的:

核心中定义了一个AppComponent

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

还有一个用于 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 是一个特殊的 ViewModelProvider.Factory,它将处理 ViewModel 键的命名,因此注入 Activities/Fragments 不需要关心它:

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)
        }    }
}

一切正常:)

问题是当我想为单独的项目模块 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

}

我收到以下错误:

AddCreditCardComponent.java:8: error: [Dagger/MissingBinding] androidx.lifecycle.ViewModelProvider.Factory cannot be provided without an @Provides-annotated method.

有什么帮助吗?我假设 ViewModelProvider.Factory 应该由我的 ViewModelFactoryModule 提供,但它没有发生:(

我设法通过以不同的方式(@Provide 而不是 @Binds)创建模块 AddCreditCardViewModelModule 来解决我的问题,我必须创建专门的 ViewModel.Factory 来关注添加的 ViewModel 实例化。

@Module
object AddCreditCardViewModelModule {

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

}

另外(感谢 David Medenjak)确保来自 AppComponent 的依赖项(例如 AdyenApi)作为“getter”公开是至关重要的。否则 AddCreditCardComponent 将无法访问它。

干杯!