Невозможно внедрить класс репозитория livingata с помощью Dagger2 - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть проект Android, который использует Dagger 2, Livedata и viewmodel, rxjava и привязку данных.

На данный момент я создал AppComponent и два субкомпонента. Appcomponent предназначен для области приложения, а один подкомпонент ControllerComponent предназначен для действий, фрагментов и диалогов. Этот ControllerComponent внедряется в базовую активность и работает нормально.

Другим субкомпонентом является RetrofitComponent, который предназначен для репозиториев viewmodel. Теперь я не могу найти способ внедрить модифицированный компонент в базовый репозиторий, так как это субкомпонент, и у меня нет applicationcontext в классе репозитория.

AppComponent:

@ApplicationScope
@Component(modules = {
    ApplicationModule.class,
    PrefModule.class
})
public interface AppComponent {
  public void inject(AppInstance appInstance);

  public AppPreference getAppPref();

  public Application getApplication();

  public ControllerComponent newControllerComponent(ControllerModule controllerModule);

  public RetrofitComponent newRetrofitComponent(RetrofitModule retrofitModule);
}

RetrofitComponent:

@RepositoryScope
@Subcomponent(modules = {RetrofitModule.class})
public interface RetrofitComponent {
  public void inject(BaseRepo baseRepo);

  public APICall getApiCalls();
}

RetrofitModule:

@Module
public class RetrofitModule {
  @Provides
  @RepositoryScope
  public APICall providePostApi(Retrofit retrofit) {
    return retrofit.create(APICall.class);
  }

  @Provides
  @RepositoryScope
  public Retrofit provideRetrofitInterface() {
    return new RetrofitService().retrofit;
  }
}

BaseRepo;

@Inject
public APICall apiCall;

private Disposable subscription;
CompositeDisposable compositeDisposable = new CompositeDisposable();

private RetrofitComponent injector;

public BaseRepo() {
    //injector = DaggerRetrofitComponent.builder().retrofitModule(new RetrofitModule()).build();(I tried with dependent component had different problem)
    injector = ((AppInstance)getApplication()).getAppComponent().newRetrofitComponent(new RetrofitModule());(Not able to use getApplication())
    injector.inject(this);
}

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

Чего мне не хватает? Или делаешь неправильно? Или мой подход неправильный?

И еще одна вещь, как только это будет сделано, я должен внедрить классы репозитория в классе Viewmodel или я должен создать фабричный класс и вызвать тот репозиторий, который мне нужен, что является лучшей практикой?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...