Android Dagger получает родительский фрагмент в дочерний фрагмент - PullRequest
0 голосов
/ 27 августа 2018

Я безуспешно пытался вставить родительский фрагмент в его субфрагменты для целей навигации.Я проследил пару разных постов, но не могу понять, что мне не хватает в моей реализации.

У меня есть MainActivity, который содержит ViewPager с одной такой страницей, содержащей EventsFragment,Этот фрагмент в свою очередь имеет два дочерних фрагмента EventsListFragment и EventsDetailFragment.Я хотел вставить фрагмент EventsFragment в EventsListFragment, чтобы я мог сказать ему перейти к EventsDetailFragment.

Я знаю, что это, вероятно, повторение постов ниже, и я действительно извиняюсь за это, но я, честно говоря, не вижу, что мне не хватает.Вот те посты, которые я нашел:

Моя реализация выглядит следующим образом:

ApplicationComponent

@Singleton
@Component(modules = [
    AndroidSupportInjectionModule::class,
    ActivityModule::class,
    BaseApplicationModule::class,
    ApplicationModule::class])
interface ApplicationComponent : AndroidInjector<AndroidApplication> {

@Component.Builder
    abstract class Builder : AndroidInjector.Builder<AndroidApplication>()
}

ActivityModule

@Module(includes = [MainActivityProvider::class])
abstract class ActivityModule{

}

MainActivityProvider

@Module(includes = [EventsFragmentProvider::class])
abstract class MainActivityProvider {
    @PerActivity
    @ContributesAndroidInjector(modules = [MainActivityModule::class])
    abstract fun provideMainActivityFactory(): MainActivity
}

EventsFragmentProvider

@Module(includes = [EventsListProvider::class, 
EventsDetailProvider::class])
abstract class EventsFragmentProvider {
    @PerFragment
    @ContributesAndroidInjector(modules = [EventsFragmentModule::class])
    abstract fun provideEventsFragmentFactory(): EventsFragment
}

EventsFragmentModule

@Module
class EventsFragmentModule {
     @Binds
     abstract fun providesEventListView(eventsFragment: EventsFragment): EventContract.Flow
}

EventsListProvider

@Module
abstract class EventsListProvider {
    @PerFragment
    @ContributesAndroidInjector(modules = [EventsListModule::class])
    abstract fun provideEventsListFragmentFactory(): EventsListFragment
}

EventsFragment

class EventsFragment : DaggerFragment(), EventContract.Flow {
    override fun navigateToList() {
        addFragment(navigator.getEventsListFragment(context!!))
    }

    override fun navigateToDetail(id: String) {
        println("id = ${id}")
    }

    ...
}

EventContract

interface EventContract {
    interface Flow {
        fun navigateToList()

        fun navigateToDetail(id: String)
    }
}

EventsListFragment

class EventsListFragment : DaggerFragment() {
    @Inject
    lateinit var eventsFlow: EventContract.Flow

    ...

}

Ошибка

[Dagger/MissingBinding] [dagger.android.AndroidInjector.inject(T)] EventContract.Flow cannot be provided without an @Provides-annotated method.
public abstract interface ApplicationComponent extends dagger.android.AndroidInjector<AndroidApplication> {
            ^
      EventContract.Flow is injected at
          EventsListFragment.eventsFlow
      EventsListFragment is injected at
          dagger.android.AndroidInjector.inject(T)
  component path: ApplicationComponent →EventsListProvider_ProvideEventsListFragmentFactory.EventsListFragmentSubcomponent

Возможно, я использую анти-шаблон, но это то, что заставило меня работатьк этому моменту.Я открыт для изменений, которые могут помочь мне достичь этого

1 Ответ

0 голосов
/ 27 августа 2018

Ошибка вызвана следующим модулем:

@Module
class EventsFragmentModule {
     @Binds
     abstract fun providesEventListView(eventsFragment: EventsFragment): EventContract.Flow
}

Кинжал не предоставит вам Fragment, и вы не должны этого делать.

Более того, я думаю, что вынеправильно понять значение @ContributesAndroidInjector.Это означает создание AndroidInjector для вас, но подтверждение экземпляра.

@Module
abstract class EventsListProvider {
    @PerFragment
    @ContributesAndroidInjector(modules = [EventsListModule::class])
    abstract fun provideEventsListFragmentFactory(): EventsListFragment
}

Таким образом, вы должны передать свой экземпляр EventsFragment в модуль, подобный этому post вместо использования вставки поля.

...