Многомодульный кинжал — ViewModelProvider.Фабрика не может быть предоставлена без метода с аннотацией @Provides

#android #dagger #viewmodelfactory #android-multi-module

Вопрос:

Я работаю над применением многомодульной структуры с помощью dagger к своему проекту. Я получаю ошибку во время работы над ViewModelFactory . Что я на самом деле хочу сделать для ViewModelFactory, так это следующее: я хочу, чтобы app module он предоставлял ViewModelFactory и feature modules использовал его.

Ошибка, с которой я столкнулся здесь, заключается в:

 C:UsersCloudDesktopdaggerMultiModuleSampleDaggerMultiModuleSamplefeature-onebuildtmpkapt3stubsdebugcomemrememilfeature_onediFeatureOneComponent.java:8: error: [Dagger/MissingBinding] androidx.lifecycle.ViewModelProvider.Factory cannot be provided without an @Provides-annotated method. public abstract interface FeatureOneComponent {  ^  androidx.lifecycle.ViewModelProvider.Factory is injected at  com.emrememil.feature_one.view.FeatureOneActivity.viewModelFactory  com.emrememil.feature_one.view.FeatureOneActivity is injected at  com.emrememil.feature_one.di.FeatureOneComponent.inject(com.emrememil.feature_one.view.FeatureOneActivity)  

AppComponent.kt

 @AppScope @Component(  dependencies = [MainComponent::class],  modules = [AppModule::class, ViewModelModule::class] ) interface AppComponent {  /**  * Inject dependencies on application.  *  * @param application The sample application.  */  fun inject(application: SampleApp) }  

AppModule.kt

 @Module class AppModule {  /**  * Create a provider method binding for [Context].  *  * @param application Sample Application.  * @return Instance of context.  * @see Provides  */  @Provides  fun provideContext(application: SampleApp): Context = application.applicationContext }  

ViewModelModule.kt

 @Module abstract class ViewModelModule {  @Binds  abstract fun bindViewModelFactory(factory: ViewModelFactory): ViewModelProvider.Factory   @Binds  @IntoMap  @ViewModelKey(FeatureOneViewModel::class)  abstract fun bindFeatureOneViewModel(featureOneViewModel: FeatureOneViewModel): ViewModel }  

ViewModelFactory.kt

 @Suppress("UNCHECKED_CAST") class ViewModelFactory @Inject constructor(  private val creators: @JvmSuppressWildcards Maplt;Classlt;out ViewModelgt;, Providerlt;ViewModelgt;gt; ) : ViewModelProvider.Factory {   override fun lt;T : ViewModelgt; create(modelClass: Classlt;Tgt;): T {  val found = creators.entries.find { modelClass.isAssignableFrom(it.key) }  val creator = found?.value  ?: throw IllegalArgumentException("unknown model class $modelClass")  try {  @Suppress("UNCHECKED_CAST")  return creator.get() as T  } catch (e: Exception) {  throw RuntimeException(e)  }  } }  

FeatureOneComponent.kt

 @FeatureScope @Component(  dependencies = [MainComponent::class],  modules = [FeatureOneModule::class] ) interface FeatureOneComponent {  fun inject(activity: FeatureOneActivity) }  

FeatureOneActivity.kt

 @Inject lateinit var viewModelFactory: ViewModelProvider.Factory  @Inject lateinit var viewModel: FeatureOneViewModel  override fun onCreate(savedInstanceState: Bundle?) {  super.onCreate(savedInstanceState)  setContentView(R.layout.activity_feature_one)   DaggerFeatureOneComponent  .builder()  .mainComponent(InjectUtils.provideAppComponent(applicationContext))  .build()  .inject(this) }