Я пытаюсь использовать кинжал в настройке нескольких модулей. Одна из моих целей — сократить количество используемых компонентов. Таким образом, в основном мы стремимся к 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)
@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
}
}
@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()
Поскольку я использую activity
для предоставления своего viewModel
, мне придется использовать @BindsInstance
для привязки экземпляра любого действия или фрагмента, который я хочу внедрить.
Короче говоря, если я изменю свой компонент функции на следующий код, он начнет работать, когда я привязываю экземпляр действия при создании компонента.
PS: Если кто-то знает, как лучше ввести фрагмент на более позднем этапе, используя только один компонент, пожалуйста, не стесняйтесь улучшить этот ответ.
@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
}
}