为什么在 Android 绑定示例中 Google 使用 val 绑定和 var _binding?

Mas*_*imo 8 android kotlin android-databinding

示例如下

private var _binding: ResultProfileBinding? = null
// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    _binding = ResultProfileBinding.inflate(inflater, container, false)
    val view = binding.root
    return view
}

override fun onDestroyView() {
    super.onDestroyView()
    _binding = null
}
Run Code Online (Sandbox Code Playgroud)

为什么使用 avar _binding和 a val binding,它只是得到_binding,而不是使用 a lateinit var bindingonly ?这个选择背后有什么隐情吗?

事实上,在活动的示例中,他们实际上使用了lateinit var

private lateinit var binding: ResultProfileBinding

override fun onCreate(savedInstanceState: Bundle) {
    super.onCreate(savedInstanceState)
    binding = ResultProfileBinding.inflate(layoutInflater)
    val view = binding.root
    setContentView(view)
}
Run Code Online (Sandbox Code Playgroud)

为什么要徒劳地使代码复杂化呢?

vik*_*mar 1

这是命名约定,如果您有私有 Kotlin 属性,那么您应该以下划线开头。

科特林文档:

支持属性的名称: 如果一个类有两个概念上相同的属性,但一个是公共 API 的一部分,另一个是实现细节,请使用下划线作为私有属性名称的前缀:

class C {
    private val _elementList = mutableListOf<Element>()

    val elementList: List<Element>
         get() = _elementList
}
Run Code Online (Sandbox Code Playgroud)

  • 我的问题不是下划线(`_binding`和`binding`都是私有的),而是真正需要有两个变量而不是单个`lateinit var` (4认同)