使用Dagger2注入OkHttpClient

时间:2016-05-08 03:33:18

标签: android android-library dagger-2 aar

我希望能够使用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时,它似乎总是为空。我究竟做错了什么?

1 个答案:

答案 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是一个很好的起点。