如何为抽象模块dagger2提供改造界面

问题描述 投票:-1回答:2

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

  • 活动保存用于加载电影列表的片段
  • 片段使用演示者使用改造命中api
  • Presenter依赖于API接口类,其中包含电影的Observale

我在演示者内部使用@Inject进行ApiService接口,但我得到一个错误,我不能使用@Inject字段而不声明提供注释,下面是我的代码

主要应用程序组件enter image description here

我的电影模块enter image description here

我的电影契约enter image description here

我的演讲者enter image description here

最后是api服务接口

enter image description here

那么我如何为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)
android retrofit2 dagger-2 rx-android dagger.android
2个回答
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提供了MoovApi服务(改造改造){retrofit.create(MoviApiService.class); }

© www.soinside.com 2019 - 2024. All rights reserved.