【问题标题】:How to provide retrofit interface to abstract module dagger2如何为抽象模块 dagger2 提供改造接口
【发布时间】:2018-03-03 20:41:57
【问题描述】:

我正在关注新的 Dagger2 对 android 的支持来实现电影列表示例应用程序,下面是我的用例。

  • Activity 包含一个用于加载电影列表的片段
  • Fragment 使用 Presenter 使用 Retrofit 访问 api
  • Presenter 依赖于 API 接口类,其中包含电影的 Observale

我在演示器中为 ApiService 接口使用 @Inject,但我收到一个错误,即我无法在不声明提供注释的情况下使用 @Inject 字段,下面是我的代码

主应用组件

我的电影模块

我的电影合约

我的主持人

最后是api服务接口

那么我怎样才能为 MoviesModule 提供服务接口,以便在演示者内部正常工作

错误是

Error:(22, 8) error: [dagger.android.AndroidInjector.inject(T)] sampler.dagger.com.movieslist.data.MoviesApiService cannot be provided without an @Provides-annotated method.
sampler.dagger.com.movieslist.data.MoviesApiService is injected at
sampler.dagger.com.movieslist.movies.MoviePresenter.mApiService
sampler.dagger.com.movieslist.movies.MoviePresenter is injected at
sampler.dagger.com.movieslist.movies.MoviesModule.moviesPresenter(presenter)
sampler.dagger.com.movieslist.movies.MoviesContract.Presenter is injected at
sampler.dagger.com.movieslist.movies.MoviesFragment.mPresenter
dagger.Lazy<sampler.dagger.com.movieslist.movies.MoviesFragment> is injected at
sampler.dagger.com.movieslist.movies.MainActivity.mMoviesFragmentsProvider
sampler.dagger.com.movieslist.movies.MainActivity is injected at
dagger.android.AndroidInjector.inject(arg0)

【问题讨论】:

  • 请附上代码而不是它的截图以及完整的错误信息。请查看how to fix cannot be provided
  • @DavidMedenjak 刚刚添加了完整的错误
  • 请查看链接的问题,因为它包含有关您的错误和可能的解决方案的所有详细信息。您必须将MoviesApiService 添加到您的模块之一并提供它。

标签: android retrofit2 dagger-2 rx-android dagger


【解决方案1】:

一种解决方案可能是:

@Module
public class APIModule {

    @Provides
    @Singleton
    Retrofit provideRetrofit(Gson gson) {
        OkHttpClient client = new OkHttpClient.Builder().build();
        return new Retrofit.Builder()
            .baseUrl("https://stackoverflow.com/")
            .addConverterFactory(GsonConverterFactory.create(gson))
            .client(client)
            .build();
    }

    @Provides
    @Singleton
    Gson provideGson() {
        return new GsonBuilder().create();
    }

    @Provides
    @Singleton
    MoviesApiService provideMoviesApiService(Retrofit retrofit) {
        return retrofit.create(MoviesApiService.class);
    }
}

在您的MoviePresenter 中,使用构造函数注入比使用字段注入更好:

private MoviesApiService mApiService;

@Inject
public MoviePresenter(MoviesApiService apiService) {
    mApiService = apiService;
}

【讨论】:

    【解决方案2】:

    MoviApiService 是一个接口,不能注入接口。您需要创建一个provides 方法来提供改造服务。

    MoviApiService 提供MoviApiService(Retrofit 改造) { 改造.create(MoviApiService.class); }

    【讨论】:

    • 是的,你可以@Binds?即在模块中:@Binds static MovieApiService provideMyApi(Retrofit retrofit) { return retrofit.create(MoviApiService.class); };。虽然 OP 应该使用构造函数注入。
    • 那是我的意思,您正在创建改造服务,而不是注入“纯界面”
    • @MarkKeen Binds 需要方法是抽象的
    • '@binds' 需要抽象,'@provides' 不需要
    • @user101530 感谢更正@Provides static MovieApiService provideMyApi(Retrofit retrofit) { return retrofit.create(MoviApiService.class); }; 在cherif - 您仍然可以注入接口吗?返回类型没问题?你的答案仍然根本不正确。
    猜你喜欢
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 2020-02-25
    • 2017-11-14
    相关资源
    最近更新 更多