MVP Presenter no se inyectó correctamente

Estoy aprendiendo Kotlin y Dagger 2 al mismo time intentando convertir parte de la muestra avanzada de MVP de Mindorks en Kotlin, pero tengo problemas para comstackr Dagger2. ¡Estoy nadando en classs aquí pero estoy muy cerca! No importa el desorder, tengo la intención de peinar sobre cada class una vez que se comstack. Si falta algo, házmelo saber. El error se networkinguce a que mi class de presentador no se inyectó correctamente en la actividad. El error dice lo siguiente:

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 

EDITAR:

Aquí hay un informe con el código defectuoso , construido con la última versión canaria de 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 y MvpInteractor son interfaces vacías básicas)

 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() } } 

No es una respuesta completa, pero muy cerca.

El problema está en out modificador de out . Con este modificador Dagger testing inyectar

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

pero tú solo provees

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

(en la function provideLoginPresenter ).

Entonces, si elimina todas out modificaciones (de Presenter , BasePresenter , LoginPresenter ), comienza la compilation y el trabajo.

No estoy seguro de por qué Dagger intenta inyectar el tipo incorrecto o no puede entender que es del mismo tipo. Parece un error durante el process de anotación. Entonces, la solución más simple: no uses out modificador con Dagger.

  • ¿Por qué no está myDayForecast.map vacío?
  • ¿Por qué puedo definir una var sin una class en Kotlin?
  • Acceder al valor del parámetro pnetworkingeterminado de una function en Kotlin
  • No se pudieron detectar las classs de configuration pnetworkingeterminadas para la class de testing con Kotlin y @AutoConfigureMockMvc
  • ¿Cómo usar Postgresql enum type via Kotlin Exposed ORM?
  • ¿Por qué el operador ternario no está "trabajando" en Kotlin?
  • Usando Moshi con múltiples campos de input
  • Error de reference sin resolver en copyOfRange
  • LinkageError en una instancia de la class Kotlin con método notify ()
  • Resaltado de syntax para los files Kotlin-script en Idea
  • Respuesta fragmentada de Vert.x con los datos de la database usando BLOB e hibernación