[英]Multimodule project - Dagger
In my Android project I have my:在我的 Android 项目中,我有我的:
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创建额外AddCreditCardComponent
和AddCreditCardViewModelModule
时。
@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.