Dagger 注入不适用于 Retrofit

Dagger inject not working for Retrofit

我正在尝试使用 Dagger 2 来实例化 Retrofit 接口。 CloudContactDataStore class 注入 RestClient 并调用它的方法。

当我实例化一个 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 class 及其实现:

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界面为Retrofit界面:

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;
    }
}

谁能看出我做错了什么?

谢谢!

这与中的问题相同,解决方案相同。也就是说,您需要将 inject(ContactDataStore) 方法更改为 inject(CloudContactDataStore) 以便它可以看到需要注入的字段,或者您需要在 ContactDataStore 中添加一个允许您注入该方法的方法你自己。