Dagger 无法提供我的依赖项
Dagger can not provide my dependencies
我在使用 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.Retrofit 无法在没有 @Inject 构造函数或 @Provides- 或 @Produces- 注释方法的情况下提供。
将 @Named("Default")
添加到 NetworkComponent
中的 Retrofit provideRetrofit();
匕首2的用法和改造可以参考以下class:
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 类似于你的网络模块 class
@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;
}
}
稍后在您的 activity class 中您可以使用 Injector.component().inject(this);
注入 dagger 2 依赖项
有关更多说明,您可以参考 this github repo
我在使用 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.Retrofit 无法在没有 @Inject 构造函数或 @Provides- 或 @Produces- 注释方法的情况下提供。
将 @Named("Default")
添加到 NetworkComponent
Retrofit provideRetrofit();
匕首2的用法和改造可以参考以下class:
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 类似于你的网络模块 class
@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;
}
}
稍后在您的 activity class 中您可以使用 Injector.component().inject(this);
注入 dagger 2 依赖项
有关更多说明,您可以参考 this github repo