Dagger2 - Multi Module - в компоненте существует привязка с соответствующим ключом

Фон

Я пытаюсь использовать кинжал в настройке нескольких модулей. Одна из моих целей — сократить количество используемых компонентов. Таким образом, в основном мы стремимся к 1 компоненту на функциональный модуль.

Настройка ядра->приложение->функция

Проблема

Кинжал терпит неудачу, за исключением A binding with matching key exists in component:, которое относится к этому I have bound a dependency somewhere in my entire object graph but it cannot be reached.

Но для моего сценария я создаю подкомпонент в своей деятельности и вызываю инъекцию, чтобы убедиться, что компонент имеет доступ к моей активности. По крайней мере, в моем понимании, это должно быть доступно, но оно все еще не может обеспечить зависимость моей модели представления.

Вот образец/мультимодуль на случай, если кто-то захочет попробовать.

Трассировки стека

/Users/feature1/build/**/FeatureComponent.java:8: error: [Dagger/MissingBinding]
com.**.FeatureActivity cannot be provided without an @Inject constructor or an @Provides-annotated 
method. This type supports members injection but cannot be implicitly provided.
public abstract interface FeatureComponent {
                ^
  A binding with matching key exists in component: com.**.FeatureComponent
      com.**.FeatureActivity is injected at
          com.**.FeatureModule.provideVM(activity)
      com.**.FeatureViewModel is injected at
          com.**.FeatureActivity.vm
      com.**.FeatureActivity is injected at
          com.**.FeatureComponent.inject(com.**.FeatureActivity)

AppComponent

@AppScope
@Component(dependencies = [CoreComponent::class])
interface AppComponent {

    fun inject(app: MainApp)

    @Component.Factory
    interface Factory {
        fun create(
            coreComponent: CoreComponent
        ): AppComponent
    }
}

Основной компонент

@Singleton
@Component
interface CoreComponent {

    fun providerContext(): Context

    @Component.Factory
    interface Factory {
        fun create(
            @BindsInstance applicationContext: Context
        ): CoreComponent
    }
}

FeatureComponent

@Component(
    modules = [FeatureModule::class],
    dependencies = [CoreComponent::class]
)
@FeatureScope
interface FeatureComponent {

    // Planning to use this component as a target dependency for the module.
    fun inject(activity: FeatureActivity)
}

Функциональный модуль

@Module
class FeatureModule {

    @Provides
    fun provideVM(activity: FeatureActivity): FeatureViewModel {
        val vm by activity.scopedComponent {
            FeatureViewModel()
        }
        return vm
    }
}

Функциональная виртуальная машина

class FeatureViewModel @Inject constructor(): ViewModel() 
0
0
563
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку я использую activity для предоставления своего viewModel, мне придется использовать @BindsInstance для привязки экземпляра любого действия или фрагмента, который я хочу внедрить.

Короче говоря, если я изменю свой компонент функции на следующий код, он начнет работать, когда я привязываю экземпляр действия при создании компонента.

PS: Если кто-то знает, как лучше ввести фрагмент на более позднем этапе, используя только один компонент, пожалуйста, не стесняйтесь улучшить этот ответ.

FeatureComponent

@Component(
    modules = [FeatureModule::class],
    dependencies = [CoreComponent::class]
)
@FeatureScope
interface FeatureComponent {

    fun inject(activity: FeatureActivity)

    @Component.Factory
    interface Factory {
        fun create(
            @BindsInstance applicationContext: FeatureActivity,
            coreComponent: CoreComponent,
        ): FeatureComponent
    }
}

Другие вопросы по теме