2015-10-02 3 views
0

Я пытаюсь использовать Кинжал 2 для создания интерфейса для модернизации. Класс CloudContactDataStore вводит RestClient и вызывает его методы.Dagger inject не работает для Retrofit

Когда я создаю объект CloudContactDataStore, его атрибут RestClient имеет значение null.

public class CloudContactDataStore implements ContactDataStore { 

    @Inject RestClient restClient; 

    public CloudContactDataStore() { 
     this.initializeInjector(); 
    } 

    private void initializeInjector() { 
     DaggerApiComponent.builder() 
       .apiModule(new ApiModule()) 
       .build() 
       .inject(this); 
    } 

    @Override 
    public Observable<ContactEntity> contactLogin(String contactId) { 
     return this.restClient.contactLogin(contactId); // Here restClient is null! 
    } 
} 

Вот как я создаю модуль Dagger и компонент:

@Singleton 
@Component(modules = ApiModule.class) 
public interface ApiComponent { 
    void inject(ContactDataStore contactDataStore); 
} 

@Module 
public class ApiModule { 

    @Provides public RestClient provideRestClient(ApiService apiService) { 
     return new RestClientImpl(apiService); 
    } 

    @Provides public ApiService provideApiService(RestAdapter restAdapter) { 
     return restAdapter.create(ApiService.class); 
    } 

    @Provides public RestAdapter provideRestAdapter() { 
     return RestApiAdapter.getInstance(); 
    } 
} 

Теперь RestClient класс и его реализация:

public interface RestClient { 
    Observable<ContactEntity> contactLogin(String contactId); 
} 

public class RestClientImpl implements RestClient { 

    ApiService apiService; 

    @Inject 
    public RestClientImpl(ApiService apiService) { 
     this.apiService = apiService; 
    } 

    @Override 
    public Observable<ContactEntity> contactLogin(String contactId) { 
     return apiService.login(contactId, "xxx-xxx-xxx"); 
    } 
} 

Интерфейс ApiService является интерфейс дооснащения:

public interface ApiService { 

    String API_BASE_URL = "http://192.168.1.2"; 

    @POST("/login") 
    Observable<ContactEntity> login(@Body String id, @Header("Key") String key); 

} 

И, наконец, RestApiAdapter:

public class RestApiAdapter { 

    private static RestAdapter sharedInstance = null; 

    public static RestAdapter getInstance() { 
     if (sharedInstance == null){ 


      sharedInstance = new RestAdapter.Builder() 
        .setLogLevel(RestAdapter.LogLevel.FULL) 
        .setEndpoint(ApiService.API_BASE_URL) 
        .build(); 
     } 

     return sharedInstance; 
    } 
} 

Может кто-нибудь увидеть, что я делаю неправильно?

Спасибо!

+0

Как вы получили доступ к компоненту кинжала в действии или фрагменте? – subhash

+0

«Активность» вызывает метод объекта. Этот объект создает экземпляр «CloudContactDataStore» и вызывает метод «contactLogin». –

ответ

1

У этой проблемы есть Why Dagger inject is not working but component.getObject yes и те же проблемы. Вам нужно либо изменить свой метод inject(ContactDataStore) на inject(CloudContactDataStore), чтобы он мог видеть поле, которое требует инъекции, или вам нужно добавить метод в ContactDataStore, который позволяет вам вводить метод самостоятельно.

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