Quando é um Viewmodel construtor da chamada no Android?

0

Pergunta

Estou passando por este codelab: https://developer.android.com/codelabs/android-lifecycles#6 Ele explica como usar o SavedStateHandle em um ViewModel para sobreviver processo de morte. O construtor do ViewModel é como abaixo:

    private SavedStateHandle mState;

    public SavedStateViewModel(SavedStateHandle savedStateHandle) {
       mState = savedStateHandle;
    }

E o viewmodel é inicializado a Atividade da seguinte forma:

    mSavedStateViewModel = new ViewModelProvider(this).get(SavedStateViewModel.class);

Quando é o ViewModel do construtor chamado? E como o Viewmodel obter o savedStateHandle parâmetro do ViewModel?

Editar:

Eu encontrei a resposta para minha pergunta através desta postagem no blog: https://www.rockandnull.com/viewmodel-savedstate/

Ele diz que, se oSavedStateHandle é o único parâmetro em nosso viewmodel é o construtor by viewModels delegado dele para o viewmodel automaticamente.

No entanto, Se temos uma combinação de parâmetros personalizados fornecidos pelo framework de injeção de dependência(Punho) e.g: o repositório, um outro casal de tempo de execução de argumentos e.g: categoria selecionada IDENTIFICAÇÃO e o SavedStateHandle para nos ajudar a sobreviver o processo de morte em viewmodel do construtor - Como nós podemos fornecer todos os parâmetros de fábrica?

Por favor, poste um pequeno exemplo para o meu entendimento

android android-lifecycle viewmodel
2021-11-24 03:13:47
1

Melhor resposta

4

O Codelab está a seguir é para fazer você entender um Conceito específico, em vez de todo o código . Nenhuma aplicação é fornecida por eles em relação a sua dúvida , o que é , como faz o ViewModel obter parâmetros ?


Visão geral : Devido a certas implementação interna do ViewModel , você pode passar argumentos para o ViewModel diretamente , em vez disso, você precisa criar uma terceira classe, que fornece os parâmetros para o ViewModel.


A resposta para a sua dúvida :

Há duas abordagens, através do qual um ViewModel pode obtê-lo parâmetros :

  1. Não-Injeção De Dependência Forma: Aqui você criar uma classe que estende ViewModelProvider.Fábrica . No seu código , aqui você pode ver :
  mSavedStateViewModel = new ViewModelProvider(this).get(SavedStateViewModel.class);

Aqui uma classe padrão é criado por onde , não há argumentos são passados .Isso é feito com a finalidade de inicialização , que é uma forma incompleta dada no codelab para expressar as necessidades . Você pode obter uma boa quantidade de conhecimento sobre o mesmo conceito através deste artigo :

https://medium.com/koderlabs/viewmodel-with-viewmodelprovider-factory-the-creator-of-viewmodel-8fabfec1aa4f

  1. Injeção De Dependência Forma: Agora , esta é a maneira mais simples de implementar um ViewModelProviders se você sabe DI-quadro Punho . Aqui você só precisa anotar o ViewModel com @ViewModelInject e está feito .O DI marco na backgroun vai criar um ViewModelFactory em vez de você fazer isso .Este é um exemplo de código de como você fornecer parâmetros para ViewModel usando Punho :

class SampleViewModel @ViewModelInject constructor(
                     @Assisted private val savedStateHandle: SavedStateHandle) : ViewModel() { }
2021-11-24 04:17:44

Eu tenho depurado o app do codelab. Construtor está sendo chamado, mesmo que eu não estou passando qualquer fábrica. Como isso é possível? Que passa o SavedStateHandle para o construtor?
Neeraja Gandla

Você pode compartilhar o link para o aplicativo ? Você executar o aplicativo localmente no Android Estúdio ? Porque o github link para o código mencionado no codelab menciona alguns usecases e sua solução , não existe verdadeira solução como uma aplicação completa
Karunesh Palekar

Você pode baixar o código fonte aqui: developer.android.com/codelabs/android-lifecycles#1
Neeraja Gandla

Também por favor veja a seção de Edição da pergunta
Neeraja Gandla

Feliz você tem a sua resposta .
Karunesh Palekar

Você pode elaborar mais sobre a sua edição ? Eu não estou conseguindo o conteúdo exato que você quer saber . ViewModel fornece a funcionalidade extra de cache de dados para a orientação do ecrã , de modo a fornecer estas funcionalidades , os desenvolvedores tinham que encontrar uma maneira , em que isso foi o que eles descobriram . Todos nós desenvolvedores do android tem que ir através de tais instâncias muito em nossa carreira, eu espero que você entenda
Karunesh Palekar

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................