Olhando para os documentos do Google para ViewModel
, eles mostram a seguir código de exemplo sobre como obter um ViewModel
:
val model = ViewModelProviders.of(this).get(MyViewModel::class.java)
Ao usar a dependência mais recente, android.arch.lifecycle:extensions:1.1.1
não existe essa classe ViewModelProviders
.
Indo para a documentação de ViewModelProviders
, vi um comentário dizendo:
Esta classe foi descontinuada no nível de API 1.1.0. Use ViewModelProvider.AndroidViewModelFactory
O problema é que, ao tentar usar ViewModelProvider.AndroidViewModelFactory
, não é possível encontrar um of
método equivalente para obter a instância do ViewModel
.
O que eu tentei fazer:
ViewModelProvider.AndroidViewModelFactory.getInstance(application).create(PlayerViewHolder::class.java)
Portanto, o nome do método create
, eu sempre recebo uma nova instância do ViewModel, o que não é o que estou procurando.
Alguma idéia de qual é a substituição do código obsoleto acima?
Respostas:
ATUALIZAÇÃO 2020-06-16 : Atualmente
ViewModelProviders
está obsoleto e não deve mais ser usado. Esta pergunta e resposta foram do final de 2018, quando não foi esse o caso. Esta pergunta e resposta também são para a edição mais antiga do Architecture ComponentsViewModelProviders
, e não para a edição AndroidX.Sim existe. Para demonstrar isso:
Crie um novo projeto no Android Studio 3.2.1 (com Kotlin,
minSdkVersion
21, modelo "atividade vazia")Adicione
android.arch.lifecycle:extensions:1.1.1
às dependências doapp
móduloIsso lhe dará um
app/build.gradle
like:Você verá a biblioteca exibida em "Bibliotecas externas" com essa classe:
E você poderá fazer referência a essa classe:
Esse comentário está abaixo da
ViewModelProviders.DefaultFactory
entrada da classe e se refere a essa classe, nãoViewModelProviders
:Use
ViewModelProviders
.fonte
ViewModelProviders.of()
não existe mais.Eu uso a
2.2.0
versão de extensões do ciclo de vida :Deve ser trabalho, usando o
ViewModelProvider
construtor.2020/5/15 Atualizar
Acho outra maneira elegante de conseguir, o Android KTX pode ajudar
Ref: https://developer.android.com/reference/kotlin/androidx/fragment/app/package-summary#viewmodels
2020/06/25: corrigido o caso do delegado
fonte
YourViewModel viewModel = new ViewModelProvider(this).get(YourViewModel.class);
TextView
ouEditText
introduzir um novo componente.Como o @FantasyFang mencionado em sua resposta, use a versão mais recente para a
lifecycle:lifecycle-extensions
que neste momento é2.2.0-alpha03
. Portanto, você deve adicionar no seu arquivo build.gradle a seguinte linha:Para quem está usando Java, para resolver isso, passe esses argumentos diretamente para o construtor do ViewModelProvider :
Ou, se você não usa uma fábrica, basta usar:
Sem passar seu objeto de fábrica.
fonte
A partir de 2.2.0. as extensões do ciclo de vida foram descontinuadas. Consulte a documentação do Google .
Este é o recorte da página:
As novas bibliotecas são:
O novo código para JAVA:
Ou para Kotlin:
fonte
Descontinuado de:
ViewModelProviders.of(this, provider).get(VM::class.java)
Para:
ViewModelProvider(this, provider).get(VM::class.java)
fonte
No início de 2020, o Google descontinuou a classe ViewModelProviders , na versão 2.2.0 da biblioteca do ciclo de vida do androidx.
Não é mais necessário usar o ViewModelProviders para criar uma instância de um ViewModel; você pode passar sua instância de Fragment ou Activity para o construtor ViewModelProvider.
Se você usar o código como:
você receberá um aviso de que o ViewModelProviders foi preterido.
Para evitar o uso de bibliotecas obsoletas, faça as seguintes alterações:
No arquivo build.gradle (Module: app), use a versão 2.2.0 dos componentes do ciclo de vida:
Se você deseja usar o ViewModel de um fragmento, use
fragment-ktx inclui automaticamente activity-ktx, assim você não precisa especificar ambos nas dependências.
Você precisa especificar o Java 8 na seção android:
Em seu Fragmento ou Atividade, altere a importação para:
import androidx.activity.viewModels
O código para criar um ViewModel se torna:
ao invés de
Use o objeto viewModel como:
Onde newNumer é um objeto LiveData
Em um fragmento que você deseja compartilhar o ViewModel da atividade, você usaria
É o equivalente a passar a instância Activity na função (descontinuada)
ViewModelProviders.of()
.fonte
ViewModelProviders.of () foi descontinuado.
Use os construtores ViewModelProvider diretamente, pois agora eles manipulam a função padrão ViewModelProvider.Factory.
fonte
Sim @Tarek, está obsoleto. Use agora com AndroidX:
fonte
ViewModelProvider(viewModelStoreOwner, factory).get(YourVideoModel::class.java)
outra forma a suaonCleared()
vontade não funcionar corretamente, e ViewModel não será mantido em toda mudança de configuração. Não use esta resposta.Provavelmente você pode apenas usar:
sem precisar adicionar
android.arch.lifecycle:extensions:1.1.1
como dependência.fonte
Use o ViewModelProvider diretamente em vez do usuário ViewModelProviders.of (), conforme mencionado nos documentos.
https://developer.android.com/reference/androidx/lifecycle/ViewModelProviders
fonte
Estou usando
android X
e também tive esse problema.Primeiro de tudo , você deve adicionar essas dependências ao seu
Gradle
:No meu caso, a $ lifecycle_version foi
2.2.0-rc02
Segundo: a importação para o
ViewModelProvider
deve ser:Você pode inicializar seu vIewModel como os exemplos abaixo:
fonte
androidx.lifecycle:lifecycle-compiler
é obsoleto porandroidx.lifecycle:lifecycle-common-java8
.Na verdade, o que o
ViewModelProviders.of()
método faz sob o capô?Toma
Fragment
como argumento, cria umViewModelProvider
objeto e passa o fragmento diretamente aoViewModelProvider
construtor.Nós podemos usar da mesma maneira também.
Por exemplo, antes:
Depois de:
fonte
ViewModelProvider
possui um construtor que espera aViewModelStoreOwner
e aFactory
.Se você usa o Kotlin, pode usar o delegado da propriedade
viewModels()
assim:Fonte: https://forums.bignerdranch.com/t/solution-to-deprecated-method-viewmodelproviders-of/16833
fonte
Não sou especialista, mas tenho uma linha de código que resolveu meu problema em Java. Espero que isso ajude alguém.
Como eu disse, gostaria de fornecer mais detalhes, mas isso corrigiu esse problema para mim.
fonte
onCleared()
não será chamado dessa maneira e seu ViewModel será recriado a cada vez (não mantido para alterações na configuração).viewModel = new ViewModelProvider(this).get(MyViewModel.class)
. Se vocêAndroidViewModel
não obtiver aApplication
, então há uma incompatibilidade de versão entre o Ciclo de vida e a Atividade / Fragmento.new ViewModelProvider.AndroidViewModelFactory(
vez de umnew ViewModelProvider(
.Usa isto:
fonte
Você pode usar isso:
"this" entre parênteses é o proprietário da instância YourViewModel.
fonte
Esta resposta é para Java, mas você pode entender o ponto principal. A solução é que você precisa usar o ViewModelProvider porque o ViewModelProviders foi preterido :
Exemplo de uso é:
Além disso, não se esqueça de atualizar as Dependências do Gradle : verifique aqui as últimas versões delas
!!! No entanto, tenha cuidado, pois algumas respostas recomendam esta solução, mas ela não funcionou para mim:
Porque quando usei dessa maneira, cheguei abaixo da Mensagem de erro:
@canerkaseler
fonte
create
,onCleared()
não funcionará corretamente.androidx.core
e suasandroidx.lifecycle
dependências.Quando você usa punhal, você passará a fábrica no construtor
fonte
Se você tem essa implementação
Tente usar
viewModel = MainViewModel()
fonte
Tente isso ...
fonte
deve funcionar dessa maneira
fonte