¿Qué es ViewModelStore y viewModelStoreOwner?

12

Estoy muy confundido debido a esta nueva API ViewModelProvider (ViewModelProviders está en desuso)

Al igual que con los nuevos cambios, también hay nuevos constructores (código fuente).

# 1

public ViewModelProvider(@NonNull ViewModelStoreOwner owner) {
        this(owner.getViewModelStore(), owner instanceof HasDefaultViewModelProviderFactory
                ? ((HasDefaultViewModelProviderFactory) owner).getDefaultViewModelProviderFactory()
                : NewInstanceFactory.getInstance());
    }

# 2

public ViewModelProvider(@NonNull ViewModelStoreOwner owner, @NonNull Factory factory) {
        this(owner.getViewModelStore(), factory);
    }

# 3

 public ViewModelProvider(@NonNull ViewModelStore store, @NonNull Factory factory) {
        mFactory = factory;
        mViewModelStore = store;
    }

Dependencia de Gradle:

implementation "androidx.lifecycle:lifecycle-extensions:2.2.0-rc02"

Entonces estos constructores requieren ViewModelStorey viewModelStoreOwner.

Doc:

@param store {@code ViewModelStore} donde se guardarán los ViewModels.

@param propietario de un {@code ViewModelStoreOwner} cuyo {@link ViewModelStore} se utilizará para retener {@code ViewModels}


¿Alguien puede definirlos y cómo usarlos y lo que realmente significan para nosotros, los desarrolladores?


¿ViewModelStoreOwner == actividad / fragmento?

Anmol
fuente

Respuestas:

6

¿Alguien puede definirlos y cómo usarlos y lo que realmente significan para nosotros, los desarrolladores?

A ViewModelStorepuede considerarse como un contenedor que almacena los ViewModels en a HashMap. Donde el keyvalor de cadena es y el valor es el ViewModel que se está guardando ( ViewModelProviderusa una concatenación del string_keynombre canónico de la clase + ViewModel).

A ViewModelStoreOwneres simplemente una interfaz. Cualquier clase que implemente lo getViewModelStore()definido por esta interfaz se convierte en el propietario de ViewModelStore. Esta clase luego mantiene el ViewModelStorey debe ser responsable de restaurarlo adecuadamente cuando sea necesario.

Podemos implementar nuestra propia versión del propietario y el estado según el requisito.

¿ViewModelStoreOwner == actividad / fragmento?

Si. Según el código fuente de Android, se implementan ambos Fragment(desde androidx.fragment.app) y ComponentActivity(desde androidx.activity) ViewModelStoreOwner. Estas clases mantienen un viewModelStorevalor y se restaura adecuadamente.

Sagar
fuente