Manually clearing an Android ViewModel?

后端 未结 12 1058
独厮守ぢ
独厮守ぢ 2020-12-04 18:50

Edit: This question is a bit out of date now that Google has given us the ability to scope ViewModel to navigation graphs. The better approach (rather

12条回答
  •  一个人的身影
    2020-12-04 19:32

    It seems like it has been already solved in the latest architecture components version.

    ViewModelProvider has a following constructor:

        /**
     * Creates {@code ViewModelProvider}, which will create {@code ViewModels} via the given
     * {@code Factory} and retain them in a store of the given {@code ViewModelStoreOwner}.
     *
     * @param owner   a {@code ViewModelStoreOwner} whose {@link ViewModelStore} will be used to
     *                retain {@code ViewModels}
     * @param factory a {@code Factory} which will be used to instantiate
     *                new {@code ViewModels}
     */
    public ViewModelProvider(@NonNull ViewModelStoreOwner owner, @NonNull Factory factory) {
        this(owner.getViewModelStore(), factory);
    }
    

    Which, in case of Fragment, would use scoped ViewModelStore.

    androidx.fragment.app.Fragment#getViewModelStore

        /**
     * Returns the {@link ViewModelStore} associated with this Fragment
     * 

    * Overriding this method is no longer supported and this method will be made * final in a future version of Fragment. * * @return a {@code ViewModelStore} * @throws IllegalStateException if called before the Fragment is attached i.e., before * onAttach(). */ @NonNull @Override public ViewModelStore getViewModelStore() { if (mFragmentManager == null) { throw new IllegalStateException("Can't access ViewModels from detached fragment"); } return mFragmentManager.getViewModelStore(this); }

    androidx.fragment.app.FragmentManagerViewModel#getViewModelStore

        @NonNull
    ViewModelStore getViewModelStore(@NonNull Fragment f) {
        ViewModelStore viewModelStore = mViewModelStores.get(f.mWho);
        if (viewModelStore == null) {
            viewModelStore = new ViewModelStore();
            mViewModelStores.put(f.mWho, viewModelStore);
        }
        return viewModelStore;
    }
    

提交回复
热议问题