Я пытаюсь реализовать шаблон 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;
Я, наверное, могу забыть показать некоторые уроки, поэтому не стесняйтесь спрашивать меня.