Android 如何使用Dagger2注入改型

Android 如何使用Dagger2注入改型,android,dagger-2,Android,Dagger 2,我正在尝试使用Dagger2实现MVP模式。虽然我成功地为应用程序、活动和片段进行了di(我不确定我是否在片段方面做得很好)。实际上,在阅读了指南之后,我仍然不明白它是如何工作的 我创建了一个modiule: @Module public class RetrofitModule { String mBaseUrl; ... @Provides @Singleton Retrofit provideRetrofit(Gson gson, OkHttpClient okHttpClien

我正在尝试使用Dagger2实现MVP模式。虽然我成功地为应用程序、活动和片段进行了di(我不确定我是否在片段方面做得很好)。实际上,在阅读了指南之后,我仍然不明白它是如何工作的

我创建了一个modiule:

@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();
}
@ActivityScoped
@Component(
    modules = LoaderActivityModule.class,
    dependencies = MyApplicationComponent.class
)
public interface LoaderActivityComponent {

void inject(LoaderActivity loaderActivity);

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

void inject(LoaderActivity loaderActivity);

}
实际上我不明白为什么我要在这里使用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);
    }
}
我仅在LoaderActivity中使用注入LoaderActivity的改装PresenterImpl

@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;
}
}
装载机活动性:

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);
}
装载机部件:

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

void inject(LoaderActivity loaderActivity);

}
@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);
}

}
LoaderActivity组件:

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

void inject(LoaderActivity loaderActivity);

}
@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;

我可能会忘记显示一些类,所以请尽管问我。

正如错误所说,您忘记将ApplicationModule添加到组件中。 顺便说一下,我强烈建议您看看,以避免手动创建这个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);