Co to jest ViewModelStore i viewModelStoreOwner?

12

Jestem bardzo zdezorientowany z powodu tego nowego API ViewModelProvider (ViewModelProviders jest przestarzały)

Podobnie jak w przypadku nowych zmian, pojawiły się również nowe Konstruktory (kod źródłowy).

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

Stopień Zależności:

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

Więc te Konstruktory wymagają ViewModelStorei viewModelStoreOwner.

Dokument:

@param store {@code ViewModelStore}, w którym będą przechowywane ViewModels.

@param jest właścicielem {@code ViewModelStoreOwner}, którego {@link ViewModelStore} zostanie wykorzystany do zachowania {@code ViewModels}


Czy każdy może je zdefiniować i jak z nich korzystać oraz co tak naprawdę oznaczają dla nas, dewelopera?


jest ViewModelStoreOwner == aktywność / fragment?

Anmol
źródło

Odpowiedzi:

6

Czy każdy może je zdefiniować i jak z nich korzystać oraz co tak naprawdę oznaczają dla nas, dewelopera?

A ViewModelStoremożna uznać za kontener, w którym przechowywane są ViewModels w HashMap. Gdzie keyjest wartością ciągu, a wartością jest zapisywany ViewModel ( ViewModelProviderużywa konkatenacji string_keynazwy kanonicznej klasy + ViewModel).

A ViewModelStoreOwnerjest jedynie interfejsem. Każda klasa, która implementuje getViewModelStore()zdefiniowany przez ten interfejs staje się właścicielem ViewModelStore. Ta klasa następnie utrzymuje ViewModelStorei powinna być odpowiedzialna za odpowiednie przywracanie jej w razie potrzeby.

Możemy wdrożyć własną wersję właściciela i państwa w zależności od wymagań.

jest ViewModelStoreOwner == aktywność / fragment?

Tak. Oparty na kodzie źródłowym Androida, implementuje zarówno Fragment(z androidx.fragment.app), jak i ComponentActivity(z androidx.activity) ViewModelStoreOwner. Klasy te zachowują viewModelStorewartość i wartość jest odpowiednio przywracana.

Sagar
źródło