Participe do evento ⁠#Android11: apresentação de lançamento da versão Beta no dia 3 de junho.

Módulo Saved State para ViewModel   Parte do Android Jetpack.

Conforme mencionado no artigo Como salvar estados de IU, os objetos ViewModel podem processar mudanças de configuração para que você não precise se preocupar com o estado em rotações ou outros casos. No entanto, caso você precise processar a interrupção do processo iniciada pelo sistema, é recomendável usar onSaveInstanceState() como backup.

O estado da IU geralmente é armazenado ou referenciado em objetos ViewModel, não em atividades. Portanto, usar onSaveInstanceState() requer algum código clichê que esse módulo possa processar para você.

Quando o módulo é configurado, os objetos ViewModel recebem um objeto SavedStateHandle por meio do construtor. Este é um mapa de chave-valor que permite gravar e recuperar objetos de e para o estado salvo. Esses valores persistirão depois que o processo for encerrado pelo sistema e permanecerão disponíveis por meio do mesmo objeto.

Configuração e uso

Ao usar Fragment 1.2.0 ou a dependência transitiva Activity 1.1.0, o factory padrão para instâncias de ViewModel é compatível com a transmissão do SavedStateHandle adequado para seu ViewModel sem nenhuma configuração adicional.

Kotlin

    // Use the Kotlin property extension in the fragment-ktx / activity-ktx artifacts
    val vm: SavedStateViewModel by viewModels()

    

Java

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

Depois disso, seu ViewModel poderá ter um construtor que recebe um SavedStateHandle:

Kotlin

    class SavedStateViewModel(private val state: SavedStateHandle) : ViewModel() { ... }
    

Java


    public class SavedStateViewModel extends ViewModel {
        private SavedStateHandle mState;

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

Ao fornecer uma instância ViewModelProvider.Factory personalizada, é possível ativar o uso de SavedStateHandle estendendo AbstractSavedStateViewModelFactory.

Como armazenar e recuperar valores

A classe SavedStateHandle tem os métodos esperados para um mapa de chave-valor:

  • get(String key)
  • contains(String key)
  • remove(String key)
  • set(String key, T value)
  • keys()

Além disso, há um método especial, getLiveData(String key), que retorna o valor agrupado a um LiveData observável.

Classes aceitáveis

Tipo/classe Compatibilidade com a matriz
double double[]
int int[]
long long[]
String String[]
byte byte[]
char char[]
CharSequence CharSequence[]
float float[]
Parcelable Parcelable[]
Serializable Serializable[]
short short[]
SparseArray
Binder
Bundle
ArrayList
Size (only in API 21+)
SizeF (only in API 21+)

Outros recursos

Para ver mais informações sobre o módulo Saved State para ViewModel, consulte os recursos a seguir.

Codelabs