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:
- Cómo utilizar Data Binding y Kotlin en Android Studio 3.0.0
- Clase de Aplicación SingleTon de Kotlin
- Kotlin cuando con varios valores no funciona cuando el valor es una vista de Android
- No se puede encontrar setter para el campo - utilizando Kotlin con base de datos de la sala
- HttpLoggingInterceptor no registra con retrofit 2
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ó.
- Archivo Kotlin vs Clase. ¿Cual es la diferencia?
- Procesamiento de anotaciones con kapt Android Studio
- Kotlin kapt y componentes de arquitectura android fallan
- Gradle kotlin Método no soportado Dependencies.getAtoms ()
- Referencia no resuelta: Kotlin necesita 2 compilaciones después de limpiar para recoger código al usar kapt
- Cómo usar Kotlin con Proguard
- Android N Java 8 características (Jack compilador) y Kotlin interoperabilidad
- Deshabilitar la generación incremental para kapt
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 >>
- Mapas androide recubrimiento de círculo, dinámicamente cambiar el radio?
- Dependencia múltiple en checkboxpreference dependencia de android o listpreference