No se puede resolver el símbolo ViewModelProviders en AppCompatActivity


122

Hola, estoy tratando de que mi ViewModel funcione, pero no he tenido suerte hasta ahora. Android Studio muestra un error Cannot resolve symbol 'ViewModelProviders'.

Cada otra pregunta que me encontré en este tema estaba corrigiendo extends Activitya extends AppCompatActivity, pero yo estoy extendiendo la correcta. No estoy seguro de lo que me falta ...
Mi código se basa en este video de YouTube

MainActivity.java

public class MainActivity extends AppCompatActivity implements
    TileAdapter.TileAdapterOnClickHandler {


private BaseViewModel viewModel;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //set Toolbar
    Toolbar myToolbar = findViewById(R.id.toolbar);
    setSupportActionBar(myToolbar);


    //initialize viewModel
    viewModel = ViewModelProviders.of(this).get(BaseViewModel.class);

BaseViewModel.java

public class BaseViewModel extends ViewModel {

private Movie[] mMovie;

public void init (Movie[] movies){
    this.mMovie = movies;
}

public Movie[] getMovie() {
    return mMovie;
}

1
"No se puede resolver el símbolo" significa que no tiene la importdeclaración, o la tiene pero no tiene la dependencia en su configuración de Gradle.
CommonsWare

9
Compruebe si tiene dependencia para android.arch.lifecycle: extensiones en build.gradle
Muthukrishnan Rajendran

O está usando alguna biblioteca y agregó la dependencia en el archivo gradle para poder importar ViewModel o tiene una clase personalizada ViewModelen el paquete diferente y lo está importando desde allí
Akshay Katariya

No tenía extensiones como dependencia. Gracias @MuthukrishnanRajendran
Sheler

Respuestas:


203

No tenía ambas dependencias en mi compilación, de ahí el problema.

implementation "android.arch.lifecycle:extensions:1.1.0"
implementation "android.arch.lifecycle:viewmodel:1.1.0"

Gracias @Muthukrishnan Rajendran


7
@Sheler Tu respuesta es correcta pero la documentación es incorrecta. En la documentación se especifica que ViewModel y LiveDat están en implementación "android.arch.lifecycle: extensions: 1.1.1"
Pritish

2
Hmm, esta solución todavía no ha resuelto mi problema. Tengo la implementación 'android.arch.lifecycle: extensions: 1.1.1' en mi aplicación gradle y allprojects {repositories {google () jcenter ()}} ¿Hay algo más que deba agregarse?
musterjunk

1
Veo la clase ViewModelProvider pero no tiene el método .of (). ViewModelProviders aún no está definido. Estoy en una Mac si eso importa.
musterjunk

¿Hay una definición de min sdk o java 8 que deba agregarse al proyecto?
musterjunk

No importa. Asegúrese de sincronizar sus archivos de graduación si no aparece.
musterjunk

96

Si está utilizando androidx, necesita esto:

implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0'

Para cualquier otra persona que tenga este problema, también necesita esto en su aplicación gradle: aplique el complemento: 'androidx.navigation.safeargs' y esto en su Android gradle: classpath "android.arch.navigation: navigation-safe-args-gradle-plugin : 1.0.0-alpha06 "Si tiene problemas para colocar estas cosas, busque en la aplicación de demostración android-sunflower de Google.
findusl

1
Consulte este enlace para obtener la última versión de androidx developer.android.com/jetpack/androidx/migrate
user2301281

¿Qué es la estupidez? ViewModelProvider está disponible sin dependencia, pero para ViewModelProviders necesitamos una dependencia adicional.
Rahul Rastogi

15

Si está utilizando sdk compilado versión 28 o superior, solo necesita agregar una dependencia única para obtener ViewModelyLiveData

dependencies {
    //...
    def lifecycle_version = "1.1.1"

    // ViewModel and LiveData
    implementation "android.arch.lifecycle:extensions:$lifecycle_version"
}

Para conocer la última versión de android.arch.lifecycle:extensionspuede buscar extensionsen maven.google.com/web/index.html y ver la última versión
Sanjeev

11

android.arch.lifecycle: las extensiones son de uso obsoleto

def lifecycle_version = "2.2.0"
implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version"

Cree una instancia de viewmodel como este:

Java

Yourclass obj = new ViewModelProvider(context).get(ClassViewModel.class);

Kotlin

var obj = ViewModelProvider(context).get(ClassViewModel::class.java)

5

debe agregar la biblioteca en build.gradle de su proyecto

def lifecycle_version = "2.0.0"

// ViewModel and LiveData
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"

5

Resuelvo este problema desde la documentación oficial de Android . Agregar a continuación abuild.grale

def lifecycle_version = "2.0.0"
// ViewModel and LiveData
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"

5

En mi caso (Android Studio 3.6.3), AppCompatActivitypara hacer con éxito:

MyViewModel myViewModel = new ViewModelProvider(this).get(MyViewModel.class);

se necesitan ambos:

implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'

(solo con lifecycle-extentionsno fue suficiente)


3

En el archivo build.gradle, agregue estas líneas en el bloque de dependencias

dependencies {
...
def lifecycle_version = "1.1.1"
// ViewModel and LiveData
implementation "android.arch.lifecycle:extensions:$lifecycle_version"
//if not using java 8,use the following line
annotationProcessor "android.arch.lifecycle:compiler:$lifecycle_version"
//if using java 8,ignore above line and add the following line
implementation "android.arch.lifecycle:common-java8:$lifecycle_version"
...
}

Imagen de muestra del archivo build.gradle


2

Usar androixbibliotecas

Cambio

implementation 'com.android.support:appcompat-v7:28.0.0'

a

implementation 'androidx.appcompat:appcompat:1.1.0-alpha03'

Puedes usar

Refactor>Migrate to AndroidX

2

En la implementación "androidx.lifecycle: lifecycle-extensions: 2.2.0" y versiones posteriores, ViewModelProviders está obsoleto, use

viewModel = ViewModelProvider(this).get(BaseViewModel.class);

o en Kotlin

viewModel = ViewModelProvider(this).get(BaseViewModel::class.java);

en vez de

viewModel = ViewModelProviders.of(this).get(BaseViewModel.class);


1

Funciona bien en mi aplicación (java) antes

loginViewModel = ViewModelProviders.of(this, new LoginViewModelFactory())
                .get(LoginViewModel.class);

cambios a

loginViewModel = new ViewModelProvider(this,new LoginViewModelFactory()).get(LoginViewModel.class);

espero que pueda ayudar


1

En mi caso, me enfrento al siguiente problema, es decir:

** no se puede acceder a androidx.lifecycle. tiene una fábrica de viewmodelprovider predeterminada que es una ingrese la descripción de la imagen aquísubclase de su nombre de clase, verifique la ruta de clase de su módulo verifique las dependencias en conflicto de su modelo **

Agregué las siguientes dependencias en mi proyecto build.gradle .

def lifecycle_version = "2.2.0"

implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"

implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"

Luego creo mi clase en un proyecto de módulo y me enfrento a este problema, luego agrego estas bibliotecas en el archivo build.gradle del módulo y el problema se resuelve.


0

Yo tuve el mismo problema. Ninguna de las otras soluciones me ayudó.

Me di cuenta de que estaba usando en import androidx.lifecycle.ViewModelProvider;lugar de import androidx.lifecycle.ViewModelProviders;.

Así que asegúrese de usar import androidx.lifecycle.ViewModelProviders;. Eso es ViewModelProviderscon un s.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.