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.

  • Accediendo a un atributo de un map Entrada (Kotlin)
  • Clase no encontrada exception con algunas comstackciones
  • Kotlin - Transforma el valor en la initialization
  • ¿Por qué es posible omitir los valores pnetworkingeterminados en las funciones de miembro reemplazadas de los subtypes?
  • El argumento de tipo genérico no está dentro de los límites
  • Mapa Mutable no anulable
  • ¿Cómo implementar finalize () en kotlin?
  • ¿Cómo mostrar solo día y mes en el cuadro de dialog selector de date en Kotlin (Android)?
  • No se puede hacer que Coverity Scan funcione (Java / Kotlin / Gradle 3.3 en Windows y Travis)
  • Acceso directo a las classs de Visibilidad interna de Kotlin
  • Implementar file Arrastrar y soltar con LWjGL