Skip to content

Component.Factory cannot be provided #1747

@ragoston

Description

@ragoston

I have a Component to provide dependencies for Data Input:

@Component(modules = [DataInputModule::class])
interface DataInputComponent {
    fun inject(activity: DataInputActivity)

    @Component.Factory
    interface Factory {
        fun create(@BindsInstance activity: DataInputActivity, module: DataInputModule): DataInputComponent
    }
}

With the module:

@Module
class DataInputModule(private val activity: DataInputActivity) {
    @Provides
    fun provideDataInputViewModel(repo: MyRepository, timestampProvider: TimestampProvider) =
        DefaultDataInputViewModel(repo, timestampProvider)

    @Provides
    fun provideTimestampProvider(): TimestampProvider = DefaultTimestampProvider()

    @Provides
    fun provideDateTimeDialogFactory(): DateTimeDialogFactory = DateTimeDialogFactory(activity)
}

My application's component looks like so:

@Singleton
@Component(
    modules = [
        DataListModule::class
    ]
)
interface AppComponent : AndroidInjector<MyApplication> {
    @Component.Factory
    interface Factory {
        fun create(@BindsInstance app: MyApplication): AppComponent
    }
}

with the module to provide the trusty Room database and the repository.
When trying to build I get the following error:

D:\Applications\AndroidStudioProjects\MyApp\app\build\tmp\kapt3\stubs\debug\com\example\myapp\di\component\DataInputComponent.java:7: error: [Dagger/MissingBinding] com.example.myapp.di.component.DataInputComponent.Factory cannot be provided without an @Provides-annotated method. public abstract interface DataInputComponent { ^ java.util.Map<java.lang.Class,javax.inject.Provider>> is injected at
dagger.android.DispatchingAndroidInjector(injectorFactoriesWithClassKeys, …)
dagger.android.DispatchingAndroidInjector<java.lang.Object> is injected at
dagger.android.DaggerApplication.androidInjector
com.example.myapp.datalist.MyApplication is injected at
com.example.myapp.di.module.DataListModule.provideMeasurementDatabase(app)
com.example.myapp.datalist.data.database.MeasurementDatabase is injected at
com.example.myapp.di.module.DataListModule.provideMeasurementDao(db)
com.example.myapp.datalist.data.repository.dao.MeasurementDao is injected at
com.example.myapp.di.module.DataListModule.provideDataRepository(dao)
com.example.myapp.datalist.data.repository.MeasurementDataRepository is injected at
com.example.myapp.di.module.DataInputModule.provideDataInputViewModel(repo, …)
com.example.myapp.datalist.presentation.viewmodel.DataInputViewModel is injected at
com.example.myapp.datalist.presentation.view.activity.DataInputActivity.viewModel
com.example.myapp.datalist.presentation.view.activity.DataInputActivity is injected at
com.example.myapp.di.component.DataInputComponent.inject(com.example.myapp.datalist.presentation.view.activity.DataInputActivity)

I cannot add a @Provides to the @Component because it is not a module. I looked for docs online but found no example of anyone "provides" annotating and providing a @Factory. So what could cause the issue here?

Note I asked this on SO but the comments' suggestions did not work.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions