Dagger-Android: невозможно ввести рекламный блок с интерфейсом - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь вставить свой нестандартный адаптер утилизатора в мой фрагмент.Адаптер содержит интерфейс (ClickHandler), который реализует мой фрагмент.Тем не менее, я не могу понять, как ввести интерфейс.Ниже показано, как я пытаюсь внедрить его.

Вот как я пытаюсь внедрить мой ClickHandler интерфейс:

@Module
public abstract class StreamsFragmentModule
{
    @Binds
    abstract ClickHandler bindStreamsFragment(StreamsFragment streamsFragment);

    @Provides 
    static ClickHandler bindClickHandler(StreamsFragment streamsFragment)
    {
        return streamsFragment;
    }
}

Вот как я использую / определяю адаптер:

public class StreamsFragment extends RecyclerFragment
{
    @Inject
    RecyclerViewBindingAdapter<BaseViewModel> bindingAdapter;
}

public abstract class RecyclerFragment extends Fragment implements ClickHandler
{
    public static class RecyclerViewBindingAdapter<T extends BaseViewModel> extends RecyclerView
    .Adapter<RecyclerViewBindingAdapter.BindingViewHolder>
{
        private final ClickHandler clickHandler;
        private List<T> viewModels;

        @Inject
        public RecyclerViewBindingAdapter(ClickHandler clickHandler)
        {
            this.clickHandler = clickHandler;
        }
}

И вот ошибка, которую я получаю:

AppComponent.java:17: error: [Dagger/DependencyCycle] Found a dependency cycle:
public interface AppComponent
   ^
  ClickHandler is injected at
      RecyclerFragment.RecyclerViewBindingAdapter(clickHandler)
  RecyclerFragment.RecyclerViewBindingAdapter<BaseViewModel> is injected at
      StreamsFragment.bindingAdapter
  StreamsFragment is injected at
      StreamsFragmentModule.bindClickHandler(streamsFragment)
  ClickHandler is injected at
      RecyclerFragment.RecyclerViewBindingAdapter(clickHandler)
  RecyclerFragment.RecyclerViewBindingAdapter<BaseViewModel> is injected at
      StreamsFragment.bindingAdapter
  FavoritesFragment is injected at
      dagger.android.AndroidInjector.inject(T) [AppComponent → ActivityBindingModule_ContributeMainActivityInjector.MainActivitySubcomponent → MainActivityModule_ContributeFavoritesFragmentInjector.FavoritesFragmentSubcomponent] 

Надеюсь, я предоставил достаточно информации,Я был бы рад обновить с большим количеством кода, если это необходимо.Я новичок в Dagger 2, поэтому любая помощь будет оценена.

1 Ответ

0 голосов
/ 15 декабря 2018

Я бы рекомендовал не использовать Dagger для этого.Просто создайте RecyclerViewBindingAdapter в StreamsFragment и передайте this как ClickHandler.

RecyclerViewBindingAdapter<BaseViewModel> adapter = new RecyclerViewBindingAdapter(this);
...