Encuadernación en el mapa con el tipo de KClass

Estoy tratando de vincular las subclases de ViewModel en un mapa por sus tipos de KClass :

 @Module abstract class ViewModelModule { @Binds @IntoMap @ViewModelKey(MyViewModel::class) abstract fun bindsMyViewModel(viewModel: MyViewModel): ViewModel @Binds abstract fun bindViewModelFactory(factory: ViewModelFactory): ViewModelProvider.Factory } 

Pero estoy recibiendo error de compilador Dagger:

 e: ~/Example/app/build/tmp/kapt3/stubs/debug/com/example/app/injection/AppComponent.java:5: error: [dagger.android.AndroidInjector.inject(T)] java.util.Map<kotlin.reflect.KClass<? extends android.arch.lifecycle.ViewModel>,? extends javax.inject.Provider<android.arch.lifecycle.ViewModel>> cannot be provided without an @Provides-annotated method. e: e: public abstract interface AppComponent { e: ^ e: java.util.Map<kotlin.reflect.KClass<? extends android.arch.lifecycle.ViewModel>,? extends javax.inject.Provider<android.arch.lifecycle.ViewModel>> is injected at e: com.example.app.ui.ViewModelFactory.<init>(creators) e: com.example.app.ui.ViewModelFactory is injected at e: com.example.app.injection.ViewModelModule.bindViewModelFactory(p0) e: android.arch.lifecycle.ViewModelProvider.Factory is injected at e: com.example.app.ui.MyFragment.setViewModelFactory(p0) e: com.example.app.ui.MyFragment is injected at e: dagger.android.AndroidInjector.inject(arg0) 

El ViewModelModule arriba se incluye en mi AppModule , que es un módulo en mi AppComponent . Así que Dagger debería ser capaz de proporcionar el Map<KClass<out ViewModel>, Provider<ViewModel>> requerido por mi ViewModelFactory , pero no puedo entender por qué se está estrellando.


También intenté cambiar la clase de la anotación de ViewModelKey sobre a Java, teniendo una Class como un parámetro del constructor en vez de un KClass . A continuación, modificó mi ViewModelFactory para que dependiera de un Map<Class<out ViewModel>, Provider<ViewModel>> , pero el mismo error ocurrió.

Cuando se utiliza KClass en una anotación, en realidad se compila a la Class de Java. Pero el problema real es el comodín en java.util.Map<kotlin.reflect.KClass<? extends android.arch.lifecycle.ViewModel>,? extends javax.inject.Provider<android.arch.lifecycle.ViewModel>> java.util.Map<kotlin.reflect.KClass<? extends android.arch.lifecycle.ViewModel>,? extends javax.inject.Provider<android.arch.lifecycle.ViewModel>> java.util.Map<kotlin.reflect.KClass<? extends android.arch.lifecycle.ViewModel>,? extends javax.inject.Provider<android.arch.lifecycle.ViewModel>> que está generando el compilador de Kotlin.

Suponiendo que @ViewModelKey se define como

 @MapKey annotation class ViewModelKey(val value: KClass<out ViewModel>) 

Deberá definir su sitio de inyección como

 Map<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>> 

El uso de @JvmSuppressWildcards evitará que el compilador genere comodines.

En realidad no sé, por qué los comodines no son compatibles con el compilador Dagger. Puedes ver un problema similar aquí: Dagger 2: ¿Cómo inyectar Map <Class <? Se extiende Foo>, Provider <? Extiende Foo >>

  • No es capaz de "findViewById" en Kotlin. Error de obtención "Inferencia de tipo no"
  • Cómo configurar múltiples valores de gravedad mediante programación en Kotlin?
  • ¿Cuáles son las ventajas del lenguaje de programación Kotlin?
  • ¿Cómo puedo representar una relación de muchos a muchos con Android Room?
  • Android studio 2.3: No se pudo inicializar la clase org.jetbrains.kotlin.android.actions.NewKotlinActivityAction
  • No se pueden resolver los métodos de registro de Anko
  • Soporte de transición de fragmentos 25.1.0 con Recyclerview
  • Crear una clase View / ViewGroup personalizada en Anko DSL
  • Objetos complementarios en las interfaces Kotlin
  • CompileKotlin bloquea en archivo build.gradle lanza error "No se pudo encontrar el método compileKotlin () para los argumentos "
  • Muchos módulos pequeños, o pocos módulos grandes para el mejor rendimiento de la construcción?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.