在ViewModel中想要创建Dialog,该怎么做?

629 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

有一个需求,要求在点击登录按钮之后发送网络请求,在等待网络请求响应的过程中,屏幕上需要弹出一个ProgressDialog,因为使用的是MVVM,所以按钮的响应事件会直接绑定到ViewModel的onLogin()方法上,但是Viewmodel又没办法获得到创建ProgressDialog所需要的Context参数,所以综合网上的资料形成了两种方案:

  1. 让ViewModel的onLogin()方法接收一个View参数,再在xml中给按钮绑定到onLogin()

image.png

image.png

这种办法看起来是可以解决问题,ProgressDialog也可以获取到Context对象。虽然说这样也不会造成内存泄露之类的问题,也不会怎么样,但是这样的做法明显违背了MVVM设计原则,我们最好不要让ViewModel掺和到View层的事情里!

  1. 在ViewModel中新加一个Livedata<Boolean>,Activity去观察这个Livedata<Boolean>,由Activity负责ProgressDialog的创建和销毁
private final MutableLiveData<Boolean> isShowDialog = new MutableLiveData<>();

image.png

viewModel.getIsShowDialog().observe(this, new Observer<Boolean>() {
    @Override
    public void onChanged(Boolean aBoolean) {
        if (aBoolean) {
            progressDialog = new ProgressDialog(TemporaryLoginActivity.this);
            progressDialog.setTitle("正在登录中...");
            progressDialog.setMessage("请稍候...");
            progressDialog.setCancelable(true);//使用back键是否可以关闭该对话框
            progressDialog.show();
        } else {
            progressDialog.dismiss();
        }
    }
});