FuManchuObey
Soy nuevo en el desarrollo de Android y actualmente estoy creando mi primera aplicación real. Estoy tratando de implementar una arquitectura MVVM y por eso tengo un modelo de vista para cada fragmento y cada modelo de vista tiene una fábrica de modelos de vista. Al menos, así es como entendí que tiene que ser.
Uso el código repetitivo que todos parecen usar para la fábrica:
class ExampleViewModelFactory(private val exampleDao: ExampleDao) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(exampleViewModel::class.java)) {
@Suppress("UNCHECKED_CAST")
return ExampleViewModel(exampleDao) as T
}
throw IllegalArgumentException("Unknown ViewModel class")
}
}
Ahora el problema es que el compilador me está dando el siguiente error:
e: C:\Users\ …\ExampleViewModel.kt: (64, 7): la herencia de una interfaz con miembros ‘@JvmDefault’ solo se permite con la opción -Xjvm-default
Y este error lo produce la clase viewModelFactory que he implementado en el viewModel. Realmente no puedo decir qué significa esto y no puedo encontrar nada útil o incluso relacionado con mi problema específico. Básicamente seguí algunos tutoriales básicos sobre cómo crear tu primera aplicación, pero sigo encontrándome con errores como este. En la mayoría de los casos, pude solucionar el problema por mí mismo, pero esta vez es diferente.
Sé que muchos de ustedes tienen mucha experiencia y conocimiento, así que espero que algunos de ustedes encuentren el tiempo para ayudarme y darme una pista de lo que puedo hacer para solucionar esto.
ianhanniballake
Parece que estás directa o indirectamente (a través de alguna otra biblioteca) dependiendo de Ciclo vital 2.5.0-alpha01
.
según este problema:
Necesita agregar temporalmente lo siguiente a su
build.gradle
:tasks.withType(KotlinCompile).configureEach { kotlinOptions { freeCompilerArgs += [ "-Xjvm-default=all", ] } }
Tenga en cuenta que, en determinadas circunstancias, es posible que desee utilizar
all-compatibility
en lugar deall
aprende más sobre eso en Entrada de blog de Jebrain.A partir de kotlin 1.6.20, no necesitará tocar build.gradle para obtener más información, consulte KT-47000
-
Si utiliza
KotlinComplie
y obtuve un error que puedes usarorg.jetbrains.kotlin.gradle.tasks.KotlinCompile
-Chirag Savsani
7 de febrero de 2022 a las 11:42
-
¿En qué build.gradle debo agregar esto?
– Shoaib Kakal
20 de febrero de 2022 a las 6:52
-
build.gradle del módulo @ShoaibKhalid
– theapache64
8 de marzo de 2022 a las 19:27
-
@TedLavender en lugar de
tasks.withType(KotlinCompile).configureEach {
Usartasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
-Chirag Savsani
17/03/2022 a las 11:35
-
¿Sería realmente una mala práctica extender ViewModelProvider.NewInstanceFactory en lugar de implementar ViewModelProvider.Factory?
– usuario2857033
28 de agosto de 2022 a las 6:41
Vivek Gupta
Actualizar; Si utiliza 1.6.20
versión de Kotlin, luego cambiando build.gradle
no es requerido.
Respuesta antigua:
Intente poner estas líneas dentro del bloque android{} en el archivo build.gradle del módulo
kotlinOptions{
freeCompilerArgs += [
"-Xjvm-default=all",
]
}
Si el código anterior no funciona, intente agregar estas líneas a continuación dentro del bloque de dependencias {}
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach{
kotlinOptions{
freeCompilerArgs +=["-Xjvm-default=all",]
}
}
-
El primero lo arregló, gracias 🙂
–Harshal Pudale
18 de noviembre de 2022 a las 15:35
Versión de Kotlin (kts) de la respuesta de @ianhanniballake
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile::class).configureEach {
kotlinOptions {
freeCompilerArgs = freeCompilerArgs + "-Xjvm-default=all"
}
}
-
Si alguna de estas declaraciones se agregara al final de
build.gradle
o hay una sección específica del archivo, es decirandroid
odependencies
que se debe colocar dentro? Recibo un error al agregar el código y sincronizar:org.gradle.internal.metaobject.AbstractDynamicObject$CustomMessageMissingMethodException: Could not find method withType() for arguments
– John Harington
16 de marzo de 2022 a las 17:33
Usa la versión estable, en este caso la 2.4.1. Tengo el mismo problema y lo resolví haciendo este cambio.
https://developer.android.com/jetpack/androidx/releases/lifecycle
En mi caso, el problema estaba en la versión de las bibliotecas de kotlin.
Estaba usando en build.gradle:
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.10
y en build.gradle (aplicación) [for Java compatibility]:
implementation "org.jetbrains.kotlin:kotlin-stdlib:1.6.10"
luego creo una variable kotlin_version común en ext:
buildscript {
ext {
...
kotlin_version='1.7.10'
} ...
y use para ambos (cada uno en su lugar respectivo):
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
Mahmud Elgamal
usa estas dependencias en tu gradle
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.5.1'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1'
Boken
Cuando anulas la diversión de crear ViewModelProvider.Factory
evitar el signo de interrogación después de vieModel
Incorrecto:
<T : ViewModel?>
Correcto:
< T : ViewModel>
Parece que hubo algunos cambios en la clase.