【问题标题】:Why safe call (?.) is needed on a layout binding variable?为什么布局绑定变量需要安全调用 (?.)?
【发布时间】:2021-10-29 03:08:01
【问题描述】:

我正在使用代码实验室:

https://developer.android.com/codelabs/kotlin-android-training-data-binding-basics?index=..%2F..android-kotlin-fundamentals#3

class MainActivity : AppCompatActivity() {
  private val myName: MyName = MyName("Aleks Haecky")
  ...

MyName 类:

data class MyName(var name: String = "", var nickname: String = "")

布局中的数据绑定变量:

<data>
    <variable
        name="myName"
        type="com.example.aboutme.MyName" />
</data>

主要活动中设置事件处理程序的代码

...
    binding.doneButton.setOnClickListener {
        addNickname(it)
    }
}

private fun addNickname(view: View) {
    binding.apply {
        myName.nickname = nicknameEdit.text.toString()
...

为什么变量 myName 会产生以下错误?

在 MyName 类型的可空接收器上只允许安全 (?.) 或非空断言 (!!.) 调用?

myName 未声明为可为空。那么为什么需要 myName?.nickname 呢?

【问题讨论】:

标签: android kotlin


【解决方案1】:

这是因为变量 myName

binding.apply {
   myName?.nickname = nicknameEdit.text.toString()
   invalidateAll()
   ...
}

不是指这个

private val myName: MyName = MyName("Aleks Haecky")

但它指的是这个xml中的myName

<data>
    <variable
        name="myName"
        type="com.example.aboutme.MyName" />
</data>

您在布局 xml 文件中定义的所有变量都可以为空。这就是为什么您每次想要访问它时都需要一个安全呼叫 (?.)。

【讨论】:

  • "您在布局 xml 文件中定义的所有变量都可以为空。"这总是真的吗?有文档吗?
  • 是的,因为您总是需要在 oncreate 中声明它,例如 binding.myName = myName 才能访问它。如果你不这样做,布局 xml 上变量 myName 的值将为空
  • binding.myName 是指布局 xml 上的变量,myName 是您定义的 MyName 类的对象
  • 如果你还是一头雾水,可以尝试为这些变量起一个不同的名字,这样你会更容易理解
  • 我在 MainActivity 中将 myName 更改为 myName2 以使其清楚。绑定.myName = myName2。该应用程序运行顺利。当我注释掉 binding.myName = myName2 行时,应用程序运行但没有显示要显示名称的位置。我的名字?行帮助消除了编译时错误,但应用程序变得错误!我弄错了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-12
  • 1970-01-01
  • 2023-03-22
  • 2020-12-13
  • 1970-01-01
相关资源
最近更新 更多