我希望能够使用 Dagger2 注入(inject)一个新的 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
时,它似乎始终为空。我究竟做错了什么?
最佳答案
What I'm I doing wrong?
void inject(OkHttpClient httpClient);
这将注入(inject)一个 OkHttpClient
及其所需的依赖项...但是由于您既没有调用它,也无法访问 okhttp 客户端的字段,因此此方法是多余且无用的。
DaggerAndroidSdkComponent.builder().networkModule(new NetworkModule())
.build();
这将构建一个组件。它将构建它。你仍然需要使用它。例如调用 inject()
并注入(inject)您要注入(inject)的对象。
您需要做的是更新您的界面,以实际将对象注入(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!)
}
}
然后您需要更新组件以知道您想要注入(inject)的SomeClass
:
@Singleton
@Component(modules = {NetworkModule.class})
public interface AndroidSdkComponent {
void inject(SomeClass someclass); // THIS will inject okhttp to your someclass object, as seen above
}
请阅读更多关于 dagger 的教程并尝试使用它,因为您似乎并不真正了解它的工作原理或不同类的作用。 User's Guide是一个很好的起点。
关于android - 使用 Dagger2 注入(inject) OkHttpClient,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37095944/