为什么Data Binding布局变量myName未声明可空却需要安全调用(?.)
报错原因
你在binding.apply { }代码块中访问的myName,并非你在MainActivity中声明的非空全局变量,而是DataBinding自动生成的绑定类自带的myName成员变量:
- 布局
<data>标签中声明的变量,DataBinding生成绑定类时默认会定义为可空类型,因为框架本身允许你不对这些变量赋值,初始状态下它们的值为null,所以绑定类中myName的类型是MyName?。 apply代码块内的作用域指向binding对象,会优先读取binding自身的myName变量,你定义在MainActivity里的非空myName被作用域遮蔽,才会触发可空类型调用的报错。
解决方法
你可以根据自己的使用习惯二选一:
- 明确指定访问MainActivity的全局变量,避开作用域遮蔽:
private fun addNickname(view: View) { binding.apply { // 加前缀明确取MainActivity的非空myName this@MainActivity.myName.nickname = nicknameEdit.text.toString() // 赋值给binding变量更新UI,不要漏这步 myName = this@MainActivity.myName invalidateAll() } }
- 提前给binding的
myName赋值,后续直接使用:
在onCreate初始化binding的时候就给binding的变量赋值:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = DataBindingUtil.setContentView(this, R.layout.activity_main) // 提前给binding的myName赋值 binding.myName = myName }
之后你在apply块里可以直接用安全调用myName?.nickname,或者确认已经赋值的情况下用非空断言myName!!.nickname即可。
内容的提问来源于stack exchange,提问作者Polymath
相关产品推荐
相关产品推荐

