Não é possível resolver ViewModelProviders de símbolo em AppCompatActivity


122

Ei, estou tentando fazer meu ViewModel funcionar, mas sem sorte até agora. O Android Studio mostra um erro Cannot resolve symbol 'ViewModelProviders'.

Cada outra pergunta que eu encontrei sobre este tema foi corrigindo extends Activitya extends AppCompatActivity, mas eu estou estendendo o caminho certo. Não tenho certeza do que estou perdendo ...
Meu código é baseado neste vídeo do 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
"Não é possível resolver o símbolo" significa que você não tem a importinstrução ou tem, mas não tem a dependência na configuração do Gradle.
CommonsWare

9
Verifique se você tem dependência para android.arch.lifecycle: extensions em build.gradle
Muthukrishnan Rajendran

Ou ele está usando alguma biblioteca e adicionou a dependência no arquivo gradle para poder importar ViewModel ou ele tem uma classe personalizada ViewModelno pacote diferente e está importando-a de lá
Akshay Katariya,

Não possuía extensões como dependência. Obrigado @MuthukrishnanRajendran
Sheler

Respostas:


203

Eu não tinha as duas dependências em minha construção, daí o problema.

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

Obrigado @Muthukrishnan Rajendran


7
@Sheler Sua resposta está correta, mas os documentos estão errados. Na documentação é especificado que ViewModel e LiveDat estão em implementação "android.arch.lifecycle: extensions: 1.1.1"
Pritish

2
Hmm, essa solução ainda não resolveu meu problema. Tenho a implementação 'android.arch.lifecycle: extensions: 1.1.1' no meu app gradle e allprojects {repositories {google () jcenter ()}} Há algo mais que precisa ser adicionado?
musterjunk

1
Vejo a classe ViewModelProvider, mas ela não tem o método .of (). ViewModelProviders ainda não está definido. Estou em um Mac, se isso importa.
musterjunk

Existe uma definição min SDK ou java 8 que precisa ser adicionada ao projeto?
musterjunk

Deixa pra lá. Certifique-se de sincronizar seus arquivos gradles se ele não aparecer.
musterjunk

96

Se você estiver usando, androidxvocê precisa disso:

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

Para qualquer outra pessoa com esse problema, você também precisa disso no seu aplicativo gradle: apply plugin: 'androidx.navigation.safeargs' e isso em seu android gradle: classpath "android.arch.navigation: navigation-safe-args-gradle-plugin : 1.0.0-alpha06 "Se você tiver problemas onde colocar essas coisas, procure no aplicativo de demonstração android-sunflower do google.
findusl

1
verifique este link para obter a versão mais recente do androidx developer.android.com/jetpack/androidx/migrate
user2301281

Qual é a estupidez! ViewModelProvider está disponível sem dependência, mas para ViewModelProviders precisamos de uma dependência extra.
Rahul Rastogi

15

Se você estiver usando o SDK compilado versão 28 ou superior, você só precisa adicionar uma dependência única para obter ViewModeleLiveData

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

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

Para saber a versão mais recente do android.arch.lifecycle:extensionsvocê pode pesquisar extensionsem maven.google.com/web/index.html e ver a versão mais recente
Sanjeev

11

android.arch.lifecycle: o uso de extensões foi suspenso

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

Crie uma instância de viewmodel como este:

Java

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

Kotlin

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

5

você deve adicionar biblioteca no build.gradle do seu projeto

def lifecycle_version = "2.0.0"

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

5

Eu resolvo esse problema com a documentação oficial do Android . Adicione abaixo parabuild.grale

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

5

No meu caso (Android Studio 3.6.3), AppCompatActivitypara fazer com sucesso:

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

é necessário:

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

(sozinho com lifecycle-extentionsnão foi suficiente)


3

No arquivo build.gradle, adicione essas linhas no bloco de dependências

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"
...
}

Imagem de amostra do arquivo build.gradle


2

Use androixbibliotecas

mudança

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

para

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

Você pode usar

Refactor>Migrate to AndroidX

2

Na implementação "androidx.lifecycle: lifecycle-extensions: 2.2.0" e superior ViewModelProviders está obsoleto, use

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

ou em Kotlin

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

ao invés de

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


1

Funciona bem no meu aplicativo (java) antes

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

muda para

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

espero que possa ajudar


1

Em Meu caso, estou enfrentando o seguinte problema, ou seja:

** não pode acessar androidx.lifecycle.has uma fábrica de viewmodelprovider padrão que é uma insira a descrição da imagem aquisubclasse de seu nome de classe, verifique o caminho de classe do módulo, verifique as dependências conflitantes do modelo **

Adicionei abaixo as dependências em meu projeto build.gradle .

def lifecycle_version = "2.2.0"

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

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

Então eu crio minha classe em um projeto de módulo e estou enfrentando esse problema, então adiciono essas bibliotecas no arquivo build.gradle do módulo e o problema é resolvido.


0

Eu tive o mesmo problema. Nenhuma das outras soluções me ajudou.

Eu percebi que estava usando import androidx.lifecycle.ViewModelProvider; vez de import androidx.lifecycle.ViewModelProviders;.

Portanto, verifique se você está usando import androidx.lifecycle.ViewModelProviders;. Isso é ViewModelProviderscom um s.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.