Qu'est-ce que ViewModelStore et viewModelStoreOwner?

12

Je suis très confus à cause de cette nouvelle API ViewModelProvider (ViewModelProviders est déconseillé)

Comme pour les nouvelles modifications, il existe également de nouveaux constructeurs (code source).

#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;
    }

Dépendance Gradle:

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

Donc, ces constructeurs exigent ViewModelStoreet viewModelStoreOwner.

Doc:

@param store {@code ViewModelStore} où ViewModels sera stocké.

@param propriétaire un {@code ViewModelStoreOwner} dont {@link ViewModelStore} sera utilisé pour conserver {@code ViewModels}


Quelqu'un peut-il les définir et comment les utiliser et ce qu'ils signifient vraiment pour nous, développeur?


est ViewModelStoreOwner == activité / fragment?

Anmol
la source

Réponses:

6

Quelqu'un peut-il les définir et comment les utiliser et ce qu'ils signifient vraiment pour nous, développeur?

A ViewModelStorepeut être considéré comme un conteneur qui stocke les ViewModels dans un HashMap. Où keyest la valeur de chaîne et la valeur est le ViewModel en cours d'enregistrement ( ViewModelProviderutilise une concaténation du string_keynom canonique de la classe + ViewModel).

A ViewModelStoreOwnern'est qu'une interface. Toute classe qui implémente le getViewModelStore()défini par cette interface devient le propriétaire de ViewModelStore. Cette classe maintient ensuite le ViewModelStoreet devrait être responsable de le restaurer de manière appropriée en cas de besoin.

Nous pouvons implémenter notre propre version du propriétaire et de l'État en fonction de l'exigence.

est ViewModelStoreOwner == activité / fragment?

Oui. Basé sur le code source Android, à la fois Fragment(de androidx.fragment.app) et ComponentActivity(de androidx.activity) implémente ViewModelStoreOwner. Ces classes conservent un viewModelStoreet la valeur est restaurée de manière appropriée.

Sagar
la source