You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin实现带回调的自定义Dialog时如何正确触发回调

问题解答

现有代码运行情况

你的现有代码无法正常触发回调,问题出在yesBtn点击事件的回调执行逻辑处:你仅引用了callback对象本身,没有调用其内部定义的run()方法,自然不会执行回调里的逻辑。

正确修改方式

直接把点击事件里的逻辑替换为调用run()方法即可,Kotlin还支持用安全调用符简化空判断,无需额外写if (callback != null)分支:

yesBtn.setOnClickListener {
    dialog.dismiss()
    callback?.run() // 空安全调用,callback不为空时自动执行run()方法
}

如果你之前尝试写callback.run()没有生效,要确认你是将该代码写在if(callback != null)的代码块内部,同时检查你自定义的Callback接口的run()方法签名是否正确,无拼写错误、参数匹配即可正常执行。修改完成后点击Dialog的确认按钮,就会正常输出Callback executed日志。

优化建议(可选)

Kotlin原生支持函数类型参数,无需额外自定义Callback接口,可以进一步简化代码:

  1. 先修改showDialog方法的参数定义,把Callback?替换为函数类型:
// 函数类型参数:无返回值的可空回调,默认值为null
private fun showDialog(header: String, message: String, callback: (() -> Unit)? = null) {
    // 其余原有代码保持不变
    yesBtn.setOnClickListener {
        dialog.dismiss()
        callback?.invoke() // 调用函数类型回调
    }
}
  1. 调用时可以直接传Lambda,无需创建匿名对象:
showDialog("My Title", "My Text") {
    println("Callback executed")
}

内容的提问来源于stack exchange,提问作者Thomas Schulze

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 22:06:03