使用应用程序创建ViewModel [英] Create ViewModel with Application

查看:100
本文介绍了使用应用程序创建ViewModel的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图将数据设置到我不希望保存任何活动引用的文件中的ViewModel上.

A类->在ViewModel中将数据设置到LiveData上 具有Application类引用,但不包含活动或片段

B类->从ViewModel中的LiveData读取数据 对此活动有参考.

B类可以随Activity的配置更改一起销毁并重新创建. 类A持久存储在内存中,并将设置数据保存到LiveData

问题:ViewModelProviders.of(活动或片段).get() ViewProvider需要活动或片段实例.

解决方案

您可以使用 解决方案

You can use AndroidViewModel, it is attached with application lifecycle.

An example:

public class ProductViewModel extends AndroidViewModel {


    private final LiveData<ProductEntity> mObservableProduct;


    public ObservableField<ProductEntity> product = new ObservableField<>();


    private final int mProductId;


    private final LiveData<List<CommentEntity>> mObservableComments;


    public ProductViewModel(@NonNull Application application, DataRepository repository,

            final int productId) {

        super(application);

        mProductId = productId;


        mObservableComments = repository.loadComments(mProductId);

        mObservableProduct = repository.loadProduct(mProductId);

    }


    /**

* Expose the LiveData Comments query so the UI can observe it.

*/

    public LiveData<List<CommentEntity>> getComments() {

        return mObservableComments;

    }


    public LiveData<ProductEntity> getObservableProduct() {

        return mObservableProduct;

    }


    public void setProduct(ProductEntity product) {

        this.product.set(product);

    }


    /**

* A creator is used to inject the product ID into the ViewModel

* <p>

* This creator is to showcase how to inject dependencies into ViewModels. It's not

* actually necessary in this case, as the product ID can be passed in a public method.

*/

    public static class Factory extends ViewModelProvider.NewInstanceFactory {


        @NonNull

        private final Application mApplication;


        private final int mProductId;


        private final DataRepository mRepository;


        public Factory(@NonNull Application application, int productId) {

            mApplication = application;

            mProductId = productId;

            mRepository = ((BasicApp) application).getRepository();

        }


        @Override

        public <T extends ViewModel> T create(Class<T> modelClass) {

            //noinspection unchecked

            return (T) new ProductViewModel(mApplication, mRepository, mProductId);

        }

    }

}

这篇关于使用应用程序创建ViewModel的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆