Как внедрить idemId для докладчика с помощью Dagger 2? dagger.android

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

Вот мой код;

@Module
public class MovieDetailActivityModule {

   @Provides
   Long provideMovieId(MovieDetailActivity movieDetailActivity) {
       return movieDetailActivity.movieId;
   }
}

@Inject
MovieDetailPresenter(
        @NonNull MovieDetailContract.View view,
        @NonNull MovieRepository movieRepository,
        @NonNull Long movieId) {
    mView = view;
    mMovieRepository = movieRepository;
    mMovieId = movieId;
}

Я получаю следующую ошибку,

MovieDetailActivity не может быть предоставлено без конструктора @Inject или с помощью аннотированного методом @Provides. Этот тип поддерживает внедрение членов, но не может быть предоставлен неявным образом.

1 ответ

Вы должны сначала предоставить свой MovieDetailActivityТак пройти MovieDetailActivity к MovieDetailActivityModule конструктор и обеспечивает активность в вашем модуле, как:

@Provides
@SomeScope
public  MovieDetailActivity activity(){
     return this.activity;
}

Но обратите внимание, что передача активности на модуль кинжала не является хорошим паттерном.

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

Если вы используете новые расширения Android-Dagger, вы можете переопределить seedInstance внутри вашего модуля для доступа к вашей деятельности

@Subcomponent.Builder abstract class Builder extends AndroidInjector.Builder<YourActivity> {
    public abstract Builder yourModule(YourModule module);

    @Override public void seedInstance(YourActivity activity) {
      yourModule(new YourModule(activity.movieId));
    }
  }
Другие вопросы по тегам