Kotlin自定义Dialog跨类设置文本遇未初始化/空指针异常求助
Kotlin CustomDialog 初始化异常解决方案
问题根源
你当前的代码逻辑是先调用title.setText()/message.setText(),再调用show(),但title和message这两个lateinit变量是在show()方法内部才通过findViewById完成初始化的。这就导致设值操作发生在变量初始化之前,必然触发UninitializedPropertyException;如果改成可空类型,设值时就是给null对象调用方法,自然抛出空指针异常。
解决方案
推荐两种适配Kotlin编码习惯的实现方式,彻底避免初始化顺序问题:
方案一:构建者模式(灵活适配复杂配置)
通过构建者模式封装所有配置参数,确保弹窗初始化时所有内容已准备完毕,同时支持链式调用:
class CustomDialog private constructor( private val context: Context, private val titleText: String?, private val messageText: String? ) { private lateinit var dialog: Dialog class Builder(private val context: Context) { private var titleText: String? = null private var messageText: String? = null fun setTitle(title: String) = apply { this.titleText = title } fun setMessage(message: String) = apply { this.messageText = message } fun build() = CustomDialog(context, titleText, messageText) } fun show() { dialog = Dialog(context).apply { setContentView(R.layout.dialog_custom) window?.setBackgroundDrawable(null) setCancelable(true) } // 初始化控件并设置文本,支持空值隐藏 dialog.findViewById<TextView>(R.id.custom_title).apply { titleText?.let { text = it } ?: run { visibility = View.GONE } } dialog.findViewById<TextView>(R.id.custom_message).apply { messageText?.let { text = it } ?: run { visibility = View.GONE } } dialog.show() } }
调用示例:
// 点击事件中使用 CustomDialog.Builder(this) .setTitle("操作提示") .setMessage("确认执行此操作吗?") .build() .show()
方案二:参数化show方法(简洁适配简单场景)
如果只需要基础的标题和消息展示,直接将文本参数传入show方法,简化实现:
class CustomDialog(private val context: Context) { private lateinit var dialog: Dialog fun show(titleText: String, messageText: String) { dialog = Dialog(context).apply { setContentView(R.layout.dialog_custom) window?.setBackgroundDrawable(null) setCancelable(true) } dialog.findViewById<TextView>(R.id.custom_title).text = titleText dialog.findViewById<TextView>(R.id.custom_message).text = messageText dialog.show() } // 重载方法,支持仅显示消息 fun show(messageText: String) { show("", messageText) dialog.findViewById<TextView>(R.id.custom_title).visibility = View.GONE } }
调用示例:
// 显示完整弹窗 CustomDialog(this).show("提示", "这是自定义弹窗内容") // 仅显示消息 CustomDialog(this).show("仅展示消息文本")
额外注意事项
- 不要将弹窗内部控件(如
title、message)暴露给外部类,破坏封装性的同时极易引发初始化顺序问题。 - 如果需要添加按钮、点击事件等更多交互,可基于构建者模式扩展参数,保持代码的可维护性。
内容的提问来源于stack exchange,提问作者msp7
相关产品推荐
相关产品推荐

