Презентатор MVP неправильно введен

Я изучаю Kotlin и Dagger 2 одновременно, пытаясь преобразовать часть Mindorks продвинутого образца MVP в Kotlin, но у меня есть проблемы с компиляцией Dagger2. Я плаваю в классах здесь, но очень близко! Не обращайте внимания на неряшливость, я собираюсь расчесывать каждый класс после его компиляции. Если что-то не хватает, пожалуйста, дайте мне знать. Ошибка сводится к тому, что мой класс презентатора не был правильно введен в действие. Ошибка читается следующим образом:

e: D:\_Dev\repo\app\build\tmp\kapt3\stubs\debug\com\xxx\di\component\ActivityComponent.java:8: error: com.xxx.login.LoginMVP.Presenter<com.xxx.login.LoginMVP.View,? extends com.xxx.login.LoginMVP.Interactor> cannot be provided without an @Provides- or @Produces-annotated method. e: e: public abstract void inject(@org.jetbrains.annotations.NotNull() e: ^ e: com.xxx.login.LoginMVP.Presenter<com.xxx.login.LoginMVP.View,? extends com.xxx.login.LoginMVP.Interactor> is injected at e: com.xxx.login.LoginActivity.presenter e: com.xxx.login.LoginActivity is injected at e: com.xxx.di.component.ActivityComponent.inject(activity) e: java.lang.IllegalStateException: failed to analyze: org.jetbrains.kotlin.kapt3.diagnostic.KaptError: Error while annotation processing 

РЕДАКТИРОВАТЬ:

Вот репо с неудачным кодом , построенным с последней версией Canary Android Studio

BaseActivity.kt

 abstract class BaseActivity : AppCompatActivity(), MvpView { val activityComponent: ActivityComponent by lazy { DaggerActivityComponent.builder() .applicationComponent((application as App).applicationComponent) .activityModule(ActivityModule(this)) .build() } } 

BasePresenter.kt

 open class BasePresenter<V : MvpView, out I: MvpInteractor> @Inject constructor(private val mvpInteractor: I) : MvpPresenter<V, I> { private var mvpView: V? = null override fun onAttach(mvpView: V) { this.mvpView = mvpView } override fun onDetach() { mvpView = null } override fun getMvpView(): V? { return mvpView } override fun getInteractor(): I { return mvpInteractor } } 

MvpPresenter.kt (MvpView и MvpInteractor – базовые пустые интерфейсы)

 interface MvpPresenter<V: MvpView, out I: MvpInteractor> { fun onAttach(mvpView: V) fun onDetach() fun getMvpView(): V? fun getInteractor(): I } 

App.kt

 class App: Application() { lateinit var applicationComponent: ApplicationComponent override fun onCreate() { super.onCreate() applicationComponent = DaggerApplicationComponent.builder() .applicationModule(ApplicationModule(this)).build() applicationComponent.inject(this) } fun getComponent(): ApplicationComponent { return applicationComponent } fun setComponent(applicationComponent: ApplicationComponent) { this.applicationComponent = applicationComponent } } 

ApplicationComponent.kt

 @Singleton @Component(modules = arrayOf(ApplicationModule::class)) interface ApplicationComponent { fun inject(app: App) @ApplicationContext fun context(): Context fun application(): Application //Pref helper //Api helper } 

ApplicationModule.kt

 @Module class ApplicationModule(val application: Application) { @Provides @ApplicationContext fun provideContext(): Context = application @Provides fun provideApplication(): Application = application //Provide api helper //Provide pref helper //Provide api key etc. } 

ActivityModule.kt

 @Module class ActivityModule(val activity: AppCompatActivity) { @Provides fun provideContext(): Context = activity @Provides fun provideActivity(): AppCompatActivity = activity @Provides fun provideLoginPresenter(presenter: LoginPresenter<LoginMVP.View, LoginMVP.Interactor>): LoginMVP.Presenter<LoginMVP.View, LoginMVP.Interactor> { return presenter } @Provides fun provideLoginMvpInteractor(interactor: LoginInteractor): LoginMVP.Interactor { return interactor } } 

ActivityComponent.kt

 @PerActivity @Component(dependencies = arrayOf(ApplicationComponent::class), modules = arrayOf(ActivityModule::class)) interface ActivityComponent { fun inject(activity: LoginActivity) } 

LoginActivity.kt

 class LoginActivity : BaseActivity(), LoaderCallbacks<Cursor>, LoginMVP.View { @Inject lateinit var presenter: LoginMVP.Presenter<LoginMVP.View, LoginMVP.Interactor> private var authTask: UserLoginTask? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_login) activityComponent.inject(this) email_sign_in_button.setOnClickListener { presenter.onServerLoginClick(email.text.toString(), password.text.toString()) } presenter.onAttach(this) } } 

LoginMVP.kt

 interface LoginMVP { interface Interactor : MvpInteractor { } @PerActivity interface Presenter<V : LoginMVP.View, out I : LoginMVP.Interactor> : MvpPresenter<V, I> { fun onServerLoginClick(email: String, password: String) } interface View : MvpView { fun openMainActivity() } } 

Это не полный ответ, но довольно близко.

Проблема заключается в модификаторе. С помощью этого модификатора Кинжал попробуйте ввести

 com.xxx.login.LoginMVP.Presenter<com.xxx.login.LoginMVP.View,? extends com.xxx.login.LoginMVP.Interactor> 

но вы предоставляете только

  com.xxx.login.LoginMVP.Presenter<com.xxx.login.LoginMVP.View, com.xxx.login.LoginMVP.Interactor> 

(в функции provideLoginPresenter ).

Поэтому, если удалить все изменения (из Presenter , BasePresenter , LoginPresenter ), он начинает компиляцию и работу.

Я не уверен, почему Dagger пытается ввести неправильный тип или не может понять, что он такой же. Это выглядит как ошибка при обработке аннотаций. Итак, самое простое решение – не используйте модификатор с кинжалом.

Intereting Posts
Как реализовать экспоненциально уменьшающуюся средневзвешенную Как загрузить фрагмент в BottomNavigationView в зависимости от выбранного элемента? Kotlin: Невозможно ли переименовать карту с деструктивным входом? Ошибка? Отправка большого файла через BLE API на Android Ожидаемое несоответствие типа с выражением в Котлине Не понимаю, как сделать подписку на флюс, работающую в Котлине Использование константы java в параметре аннотации Kotlin Какова цель возврата единиц в функции Метод вызова в родовом классе через отражение Веб-приложение Kotlin | ссылка css-файл Использование функции Kotlin как типа Java SAM Класс тестирования детей Kotlin запускает все родительские тесты Почему Kotlin с Spring MVC JSON возвращает пустой объект? kotlin map based properties и Jackson не работают – делегируйте точки на другую карту, чтобы свойство карты Kotlin: Что я могу сделать, если в библиотеке Java есть перегрузка как примитивного, так и вложенного типа?