2016-05-08 4 views
1

Я хочу, чтобы иметь возможность вводить новый OkHttpClient с помощью Dagger2, но мне тяжело. Большинство учебных пособий и инструкций написаны для приложений, и я создаю aar (андроидная библиотека).Injecting OkHttpClient с помощью Dagger2

вот мой компонент:

@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, кажется, всегда имеет значение null. Что я делаю не так?

ответ

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 - хорошее место для начала.

Смежные вопросы