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
中添加一个允许您注入该方法的方法你自己。
我正在尝试使用 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
中添加一个允许您注入该方法的方法你自己。