Модуль должен быть установлен кинжалом 2 - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь создать зависимости, используя dagger 2 с kotlin.Я получаю эту ошибку во время выполнения

Причина: java.lang.IllegalStateException: pk.telenorbank.easypaisa.di.modules.RetrofitApiModule должен быть установлен в pk.telenorbank.easypaisa.di.DaggerAppComponent $Builder.build (DaggerAppComponent.java:54) в pk.telenorbank.easypaisa.EasypaisaApp.onCreate (EasypaisaApp.kt: 22) в android.app.Instrumentation.callApplicationOnCreate (Instrumentation.java:1015) в android.app.Ab.Activity.(ActivityThread.java:4834) в android.app.ActivityThread.access $ 1600 (ActivityThread.java:168) в android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1440) в android.os.Handler.dispatchMessage (обработчик.java: 102) в android.os.Looper.loop (Looper.java:150) в android.app.ActivityThread.main (ActivityThread.java:5659) в java.lang.reflect.Method.invoke (собственный метод) вcom.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:822) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:712)

Вот график зависимости.

@Module(includes = arrayOf(NetworkModule::class))
class RetrofitApiModule(val retrofitMvpApi: RetrofitMvpApi) {
    @Provides
    @Singleton
    fun provideMvpApi(): RetrofitMvpApi {
        return retrofitMvpApi
    }
}

Вот RetorfitMvpApi

@Singleton
class RetrofitMvpApi @Inject constructor(retrofit: Retrofit) : MvpApi {

    var retrofitService: RetrofitService

    init {
        retrofitService = retrofit.create(RetrofitService::class.java)
    }

    override fun login(source: String) =
            retrofitService.getPosts(source, Constants.API_KEY)
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .map { rs -> rs }
                    .doOnError { t -> t.printStackTrace() }


    interface RetrofitService {
        @POST
        fun getPosts(@Query("sources") source: String,
                     @Query("apiKey") key: String): Observable<WSResponse>
    }
}

Вот компонент.

@Singleton
@Component(modules = arrayOf(AppModule::class, RetrofitApiModule::class))
interface AppComponent {

    fun loginComponent(loginModule: LoginModule) : LoginComponent
}

Что я здесь не так делаю?Я использую dagger 2.15

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Dagger автоматически создаст Module для графа зависимостей, если у этого Module есть конструктор по умолчанию.Если вы используете пользовательский конструктор, тогда вы должны указать Module при построении графика.

Для кода Java:

@Module
public class ContextModule {

  private final Context context;

  public ContextModule(Context context) {
      this.context = context;
  }

  @Provides
  @GithubApplicationScope
  @ApplicationContext
  public Context provideContext(){
      return context.getApplicationContext();
  }

}

Построение графика:

    githubApplicationComponent = DaggerGithubApplicationComponent.builder()
        .contextModule(new ContextModule(this))
        // not needed as Dagger automatically generate module class with no arguments
        //.networkModule(new NetworkModule())
        .build();
0 голосов
/ 24 мая 2018

Ваш метод provideMvpApi должен взять экземпляр retrofitMvpApi и вернуть его интерфейс:

@Module(includes = arrayOf(NetworkModule::class))
class RetrofitApiModule() {
    @Provides
    @Singleton
    fun provideMvpApi(val retrofitMvpApi: RetrofitMvpApi): MvpApi {
        return retrofitMvpApi
    }
}
...