我的旧Java版本方法如下所示:

@Override
public void closeSimpleAlertDialog() {
    if (mAlertDialog != null && mAlertDialog.isShowing()) {
        mAlertDialog.dismiss();
    }
}

如您所知,检查空引用是否链接到对话框mAlertDialog,如果不为空,则检查调用方法isShowing(),然后才导致关闭dismiss()方法。很简单的

我遇到了一个问题-如何仍然以“ Kotlin 风格”执行相同的操作?

我的第一个版本在这里:
if (mAlertDialog != null && mAlertDialog?.isShowing) {
        mAlertDialog?.dismiss()
}

下一步将mAlertDialog != null && mAlertDialog?.isShowing更改为mAlertDialog?.isShowing ?: false,最新版本如下:
if (mAlertDialog?.isShowing ?: false)
            mAlertDialog?.dismiss()

但是我不明白。为什么我需要“?”如果之前已经进行过null检查(此处:mAlertDialog?.)?

最佳答案

因为另一个线程可能在null检查之后和调用dismiss之前使该属性为null。如果使用局部变量或let,则不会发生这种情况。

顺便说一句,如果您省略问号并徘徊在红色波浪状符号上,IntelliJ会告诉您



用Kotlin做到这一点的规范方法(AFAIK)是

fun close() {
    mAlertDialog?.let {
        if (it.isShowing) {
            it.dismiss()
        }
    }
}

10-01 21:01