我希望能够使用Dagger2注入新的OkHttpClient
但是我很难过。大多数教程和说明都是为应用程序编写的,我正在构建一个aar(android库)。
这是我的组件:
@Singleton
@Component(modules = {NetworkModule.class})
public interface AndroidSdkComponent {
void inject(OkHttpClient httpClient);
}
这是我的模块:
@Module
public class NetworkModule {
@Provides
@Singleton
OkHttpClient provideOkHttpClient(Context context) {
final OkHttpClient client = new OkHttpClient();
if (Configuration.isAlphaBuild(context)) {
client.networkInterceptors().add(new StethoInterceptor());
}
return client;
}
}
在我的库的入口点,我构建了这样的组件:
DaggerAndroidSdkComponent.builder().networkModule(new NetworkModule())
.build();
但稍后当我尝试@Inject OkHttpClient okHttpClient
时,它似乎总是为空。我究竟做错了什么?
答案 0 :(得分:2)
我做错了什么?
void inject(OkHttpClient httpClient);
这将为OkHttpClient
注入它需要的依赖项......但既然你既没有调用它,也没有访问okhttp客户端的字段,那么这种方法是多余的,没用。
DaggerAndroidSdkComponent.builder().networkModule(new NetworkModule())
.build();
这将构建一个组件。它将构建它。你仍然需要使用它。例如调用inject()
并注入要注入的对象。
您需要做的是更新界面以实际将对象注入到中的OkHttpClient
。您没有提供任何有关您希望使用该客户端的信息,但您应该使用SomeClass
,如下所示,您已使用上面提供的代码构建组件:
class SomeClass {
@Inject
OkHttpClient mClient(); // THIS is how you mark a field for injection
void someMethod() {
AndroidSdkComponent component = DaggerAndroidSdkComponent.builder().networkModule(new NetworkModule())
.build();
component.inject(this); // THIS is how you inject a field (okhttp!)
}
}
然后,您需要将组件更新为知道关于您要注入的SomeClass
:
@Singleton
@Component(modules = {NetworkModule.class})
public interface AndroidSdkComponent {
void inject(SomeClass someclass); // THIS will inject okhttp to your someclass object, as seen above
}
请阅读更多有关匕首的教程并尝试使用它,因为您似乎并不真正理解它是如何工作的或不同的类所做的。 User's Guide是一个很好的起点。