我遇到了Dagger 2的问题。 我想要一个通用的NetworkModule,我可以分享我的改造等等。然后我想要子组件,以便每个流程我有不同的改造接口,例如登录,...
我现在的设置是:
@Module
public class NetworkModule {
@Provides
@Singleton
@Named("Default")
Retrofit provideRetrofit() {
Retrofit retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl("myUrl")
.build();
return retrofit;
}
}
我还有一个ApplicationModule(我不知道这是否是使用ApplicationModule的正确方法)。
@Module
public class ApplicationModule {
private Application application;
public ApplicationModule(Application application) {
this.application = application;
}
@Provides
@Singleton
Application providesApplication() {
return this.application;
}
}
最后但并非最不重要的是我的组件将两者结合在一起:
@Singleton
@Component(modules = {ApplicationModule.class, NetworkModule.class})
public interface NetworkComponent {
Retrofit provideRetrofit();
void inject(MainActivity activity);
}
现在我没有看到问题,但是当我这样做时:
((MyApplication) getApplication()).getNetworkComponent().inject(this);
将其创建为:
DaggerNetworkComponent.builder().applicationModule(new ApplicationModule(this)).build();
我无法编译并收到错误:
retrofit2如果没有@Inject构造函数或者@ Provide-或@ Produces-annotated方法,则无法提供改进。
答案 0 :(得分:2)
将@Named("Default")
添加到Retrofit provideRetrofit();
NetworkComponent
答案 1 :(得分:0)
您可以参考以下类别来了解dagger 2和改装:
<强> Injector.java 强>
public class Injector {
// Singleton instance
private static Injector instance;
// components
private AppComponent appComponent;
// Private constructor to make it singleton
private Injector() {
}
/**
* Get the singleton Injector instance
*
* @return Injector
*/
private static Injector instance() {
if (instance == null) {
instance = new Injector();
}
return instance;
}
/**
* Creates application component which used of injection later.
*
* @param application
*/
public static void createApplicationComponent(Application application) {
if (instance().appComponent == null) {
instance().appComponent = DaggerAppComponent.builder()
.appModule(new AppModule(application))
.build();
}
}
/**
* Returns the component for injection.
*
* @return
*/
public static AppComponent component() {
return instance().appComponent;
}
}
<强> AppComponent.java 强>
@Singleton
@Component(modules = {
AppModule.class,
ApiModule.class,
})
public interface AppComponent {
// Other utility classes for injection
}
ApiModule.java ,类似于您的网络模块类
@Module
public class ApiModule {
@Provides
@Singleton
public Retrofit provideApi(
OkHttpClient client,
Converter.Factory converterFactory,
CallAdapter.Factory callAdapterFactory) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Config.API_BASE_URL)
.client(client)
.addConverterFactory(converterFactory)
.addCallAdapterFactory(callAdapterFactory)
.build();
return retrofit;
}
}
<强> AppModule.java 强>
@Module
public class AppModule {
private Application application;
public AppModule(Application application) {
this.application = application;
}
@Provides
@Singleton
public Application provideApplication() {
return application;
}
@Provides
@Singleton
public Context provideContext() {
return application;
}
}
稍后在您的活动类中,您可以使用Injector.component().inject(this);
注入dagger 2依赖项
有关更多说明,请参阅this github repo