【问题标题】:LiveData doesn't observe changes occurred from another view model instance?LiveData 没有观察到另一个视图模型实例发生的变化?
【发布时间】:2018-12-26 15:03:37
【问题描述】:

我有一个AndroidViewModel 用于两个fragments 并包含一个LiveData 对象,如下所示

public class CartViewModel<v extends CartCallback> extends BaseViewViewModel<v> {

    private RoomDb roomDb;
    private BaseApi api;
    private AppExecutors executors;
    private PrefsManger prefsManger;

    private LiveData<List<LineEntity>> lines;
    private LiveData<List<ImageEntity>> images;
    private MutableLiveData<CartInfo> cartInfo;

    private LiveData<Long> linesCount;


    public CartViewModel(Application application, RoomDb roomDb, BaseApi api, AppExecutors executors, PrefsManger prefsManger) {
        super(application);
        this.roomDb = roomDb;
        this.api = api;
        this.executors = executors;
        this.prefsManger = prefsManger;

        lines = roomDb.lineDao().getAllLines();
    }


    public LiveData<List<LineEntity>> getLines() {
        return lines;
    }

    public void saveOfflineLine(LineEntity entity) {
        executors.diskIO().execute(() -> roomDb.lineDao().save(entity));
    }
}

在两个片段中我都像这样启动视图模型

CartViewModel cartViewModel = ViewModelProviders.of(this, cartFactory).get(CartViewModel.class);
    cartViewModel.attachView(this);

当我观察到来自一个片段的 liveData 和来自另一个片段的用户 saveOfflineLine(entity) 时 onChange 不会触发 但是如果从同一个片段观察和保存(意味着来自视图模型的同一个实例)onChange触发成功

【问题讨论】:

    标签: android mvvm android-room android-architecture-components android-livedata


    【解决方案1】:

    如下所示,传入getActivity() 而不是this,以便在片段之间共享视图模型

    CartViewModel cartViewModel = ViewModelProviders.of(getActivity(),cartFactory).get(CartViewModel.class);
    

    【讨论】:

    • 但是,这个 Activity 有很多显示和消失的片段,所以我需要 lifeCycleOwner 作为片段,而不是 Activity。
    猜你喜欢
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多