Как ввести модификацию с помощью Dagger2 - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь реализовать шаблон MVP, используя Dagger2. В то время как я успешно сделал di для заявления, действий и для фрагментов (я не уверен, что преуспел с фрагментами). На самом деле после прочтения руководств я все еще не понимаю, как это работает.

Я создал RetrofitModiule:

@Module
public class RetrofitModule {
     String mBaseUrl;
...
@Provides
@Singleton
Retrofit provideRetrofit(Gson gson, OkHttpClient okHttpClient) {
    return new Retrofit.Builder()
            .addConverterFactory(GsonConverterFactory.create(gson))
            .baseUrl(mBaseUrl)
            .client(okHttpClient)
            .build();
}

Затем я объявляю модуль в MyApplicationComponent:

@Singleton
@Component(
        modules = {
                MyApplicationModule.class,
                RetrofitModule.class
        }
)
public interface MyApplicationComponent {
     void inject(MyApplication myApplication);
     Retrofit provideRetrofit();
}

На самом деле я не понимаю, почему я должен использовать Inject здесь; Потому что в MyApplication нечего в действительности вставлять:

public class MyApplication extends Application {
    private MyApplicationComponent mMyApplicationComponent;
    ...
    @Override
    public void onCreate() {
        super.onCreate();
        mMyApplicationComponent = DaggerMyApplicationComponent.builder()
            .retrofitModule(new RetrofitModule("https://androidtutorialpoint.com"))
            .build();
        mMyApplicationComponent.inject(this);
    }
}

Я использую Retrofit только в LoaderActivityPresenterImpl, который вводится в LoaderActivity;

@ActivityScoped
public class LoaderActivityPresenterImpl implements LoaderActivityPresenter {

private LoaderActivityView mView;
private @ActivityContext Context mContext;
private Retrofit mRetrofit;

@Inject
public LoaderActivityPresenterImpl(LoaderActivityView view, @ActivityContext Context context, Retrofit retrofit) {
    mView = view;
    mContext = context;
    mRetrofit = retrofit;
}
}

LoaderActivity:

public class LoaderActivity extends BaseActivity implements LoaderActivityView{

@Inject LoaderActivityPresenter mPresenter;
private LoaderActivityComponent mLoaderActivityComponent;

@Override
protected void setupActivityComponent(MyApplicationComponent myApplicationComponent) {
    mLoaderActivityComponent = DaggerLoaderActivityComponent.builder()
            .myApplicationComponent(myApplicationComponent)
            .loaderActivityModule(new LoaderActivityModule(this, this, myApplicationComponent.provideRetrofit()))
            .build();
    mLoaderActivityComponent.inject(this);
}

LoaderComponent:

@ActivityScoped
@Component(
    modules = LoaderActivityModule.class,
    dependencies = MyApplicationComponent.class
)
public interface LoaderActivityComponent {

void inject(LoaderActivity loaderActivity);

}

LoaderActivityModule:

@Module
public class LoaderActivityModule {

private Retrofit mRetrofit;
private LoaderActivityView mLoaderActivityView;
private @ActivityContext Context mContext;

public LoaderActivityModule(LoaderActivityView loaderActivityView, @ActivityContext Context context, Retrofit retrofit) {
    mLoaderActivityView = loaderActivityView;
    mContext = context;
    mRetrofit = retrofit;
}

@Provides
LoaderActivityView provideLoaderActivityView() {
    return mLoaderActivityView;
}

@Provides
public @ActivityContext Context provideActivityContext() {
    return mContext;
}

@Provides
public LoaderActivityPresenter LoaderActivityPresenterImpl() {
    return new LoaderActivityPresenterImpl(mLoaderActivityView, mContext, mRetrofit);
}

}

LoaderActivityComponent:

@ActivityScoped
@Component(
    modules = LoaderActivityModule.class,
    dependencies = MyApplicationComponent.class
)
public interface LoaderActivityComponent {

void inject(LoaderActivity loaderActivity);

}

Я получаю эту ошибку:

java.lang.RuntimeException: Unable to create application com.xxxxx.application.MyApplication: java.lang.IllegalStateException: com.xxxxx.di.modules.MyApplicationModule must be set;

Я, наверное, могу забыть показать некоторые уроки, поэтому не стесняйтесь спрашивать меня.

1 Ответ

0 голосов
/ 27 июня 2018

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

public class MyApplication extends Application {
private MyApplicationComponent mMyApplicationComponent;
...
@Override
public void onCreate() {
    super.onCreate();
    mMyApplicationComponent = DaggerMyApplicationComponent.builder()
        .myApplicationModule()
        .retrofitModule(new RetrofitModule("https://androidtutorialpoint.com"))
        .build();
    mMyApplicationComponent.inject(this);
...