En cuanto a los documentos de Google para ViewModel
, muestran el siguiente código de ejemplo sobre cómo conseguir una ViewModel
:
val model = ViewModelProviders.of(this).get(MyViewModel::class.java)
Cuando se usa la última dependencia android.arch.lifecycle:extensions:1.1.1
no existe tal clase ViewModelProviders
.
Ir a la documentación para ViewModelProviders
, vi un comentario diciendo:
Esta clase quedó en desuso en el nivel API 1.1.0. Utilice ViewModelProvider.AndroidViewModelFactory
El problema es que, al intentar usarlo ViewModelProvider.AndroidViewModelFactory
, no puede encontrar un of
método equivalente para obtener la instancia de ViewModel
.
Lo que intenté hacer:
ViewModelProvider.AndroidViewModelFactory.getInstance(application).create(PlayerViewHolder::class.java)
De ahí el nombre del método create
, obtengo una nueva instancia del ViewModel cada vez que lo llamo, que no es lo que busco.
¿Alguna idea de cuál es el reemplazo del código en desuso anterior?
Respuestas:
ACTUALIZACIÓN 2020-06-16 : Actualmente
ViewModelProviders
está en desuso y ya no debe usarse. Esta pregunta y respuesta fueron de fines de 2018, cuando ese no era el caso. Esta pregunta y respuesta también son para la edición anterior de Architecture ComponentsViewModelProviders
, no para la edición de AndroidX.Sí hay. Para demostrar esto:
Cree un nuevo proyecto en Android Studio 3.2.1 (con Kotlin,
minSdkVersion
21, plantilla de "actividad vacía")Agregar
android.arch.lifecycle:extensions:1.1.1
a las dependencias delapp
móduloEsto te dará un
app/build.gradle
like:Luego verá que la biblioteca aparece en "Bibliotecas externas" con esa clase:
Y podrás hacer referencia a esa clase:
Ese comentario está debajo de la
ViewModelProviders.DefaultFactory
entrada de clase y se refiere a esa clase, no aViewModelProviders
:Uso
ViewModelProviders
.fuente
ViewModelProviders.of()
ya no existe.Yo uso la
2.2.0
versión de extensiones de ciclo de vida :Debería ser trabajo, utilizando
ViewModelProvider
constructor.Actualización 2020/5/15
Encuentro otra forma elegante de lograrlo, Android KTX puede ayudar
Ref: https://developer.android.com/reference/kotlin/androidx/fragment/app/package-summary#viewmodels
2020/06/25: corrigió el caso del delegado
fuente
YourViewModel viewModel = new ViewModelProvider(this).get(YourViewModel.class);
TextView
oEditText
introducirá un nuevo componente.Como @FantasyFang mencionó en su respuesta, use la última versión para la
lifecycle:lifecycle-extensions
que es en este momento2.2.0-alpha03
. Por lo tanto, debe agregar en su archivo build.gradle la siguiente línea:Para aquellos que usan Java, para resolver esto, pase esos argumentos directamente al constructor de ViewModelProvider :
O si no usa una fábrica, simplemente use:
Sin pasar su objeto de fábrica.
fuente
A partir de 2.2.0. las extensiones de ciclo de vida han quedado en desuso. Consulte la documentación de Google .
Este es el corte de la página:
Las nuevas bibliotecas son:
El nuevo código para JAVA:
O para Kotlin:
fuente
En desuso de:
ViewModelProviders.of(this, provider).get(VM::class.java)
A:
ViewModelProvider(this, provider).get(VM::class.java)
fuente
A principios de 2020, Google ha desaprobado la clase ViewModelProviders , en la versión 2.2.0 de la biblioteca de ciclo de vida de androidx.
Ya no es necesario usar ViewModelProviders para crear una instancia de ViewModel, puede pasar su instancia de Fragmento o Actividad al constructor ViewModelProvider.
Si usa el código como:
recibirá una advertencia de que ViewModelProviders ha quedado en desuso.
Para evitar el uso de bibliotecas obsoletas, realice los siguientes cambios:
En el archivo build.gradle (Módulo: aplicación), use la versión 2.2.0 de los componentes del ciclo de vida:
Si en su lugar desea usar ViewModel desde un Fragmento, use
fragment-ktx incluye automáticamente activity-ktx, por lo que no necesita especificar ambos en las dependencias.
Debe especificar Java 8 en la sección de Android:
En su Fragmento o Actividad, cambie la importación a:
importar androidx.activity.viewModels
El código para crear un ViewModel se convierte en:
en vez de
Utilice el objeto viewModel como:
donde newNumer es un objeto LiveData
En un fragmento que desea compartir el modelo de vista de la actividad, usaría
Eso es equivalente a pasar la instancia de Activity en la función (en desuso)
ViewModelProviders.of()
.fuente
ViewModelProviders.of () ha quedado en desuso.
Utilice los constructores ViewModelProvider directamente ya que ahora manejan el rol predeterminado de ViewModelProvider.Factory.
fuente
Sí @Tarek, está en desuso. Úselo ahora con AndroidX:
fuente
ViewModelProvider(viewModelStoreOwner, factory).get(YourVideoModel::class.java)
contrario, debería usar unonCleared()
no funcionará correctamente, y ViewModel no se mantendrá durante el cambio de configuración. No uses esta respuesta.Probablemente puedas usar:
sin necesidad de agregar
android.arch.lifecycle:extensions:1.1.1
como la dependencia.fuente
Use ViewModelProvider directamente en lugar del usuario ViewModelProviders.of () como se menciona en los documentos.
https://developer.android.com/reference/androidx/lifecycle/ViewModelProviders
fuente
Estoy usando
android X
y también tuve este problema.En primer lugar , debe agregar estas dependencias a su
Gradle
:En mi caso, la versión $ lifecycle_version fue
2.2.0-rc02
Segundo: la importación para el
ViewModelProvider
debe ser:Luego puede inicializar su vIewModel como en los ejemplos a continuación:
fuente
androidx.lifecycle:lifecycle-compiler
está obsoleto porandroidx.lifecycle:lifecycle-common-java8
.En realidad, ¿qué hace el
ViewModelProviders.of()
método debajo del capó?Toma
Fragment
como argumento, crea unViewModelProvider
objeto y pasa el fragmento directamente alViewModelProvider
constructor.Podemos usar la misma manera también.
Ej. Antes:
Después:
fuente
ViewModelProvider
tiene un constructor que espera tanto aViewModelStoreOwner
como aFactory
.Si usa Kotlin, puede usar el delegado de propiedades de
viewModels()
esta manera:Fuente: https://forums.bignerdranch.com/t/solution-to-deprecated-method-viewmodelproviders-of/16833
fuente
No soy un experto, pero tengo una línea de código que resolvió mi problema en Java. Espero que esto ayude a alguien.
Como dije, me encantaría proporcionar más detalles, pero esto solucionó este problema para mí.
fuente
onCleared()
no se llamará de esta manera y su ViewModel se volverá a crear cada vez (no se guarda para los cambios de configuración).viewModel = new ViewModelProvider(this).get(MyViewModel.class)
. SiAndroidViewModel
no obtiene elApplication
, entonces tiene una versión que no coincide entre Lifecycle y Activity / Fragment.new ViewModelProvider.AndroidViewModelFactory(
lugar de unnew ViewModelProvider(
.Utilizar este:
fuente
Puedes usar esto en su lugar:
"this" entre paréntesis es el propietario de la instancia de YourViewModel.
fuente
Esta respuesta es para Java pero puedes entender el punto principal. Solución es que usted necesita el uso ViewModelProvider porque ViewModelProviders en desuso :
El uso de ejemplo es:
Además, no olvide actualizar las dependencias de Gradle : consulte aquí las últimas versiones de ellas
!!! Sin embargo, tenga cuidado porque algunas respuestas recomiendan esta solución, pero no funcionó para mí:
Porque cuando lo usé de esta manera, obtuve el siguiente mensaje de error:
@canerkaseler
fuente
create
,onCleared()
no funcionará correctamente.androidx.core
y susandroidx.lifecycle
dependencias.Cuando uses la daga, pasarás la fábrica en el constructor
fuente
Si tienes esta implementación
Tratar de usar
viewModel = MainViewModel()
fuente
Prueba esto...
fuente
debería funcionar de esta manera
fuente