如开发人员文档中所述,使用以下模式有什么好处

What is the advantage of using following pattern as described in developer docs

我正在浏览有关数据绑定的开发人员文档。我找到了以下片段:

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
}

谁能告诉我在同一片段中使用两个变量进行绑定的原理和优点?

binding 是一个 non-null 属性 具有可为空的支持字段,因此当您访问它时,您不必经常使用 ? 来检查是否为空。

然而,如果在评论中描述的无效时访问它,它将抛出 KotlinNullPointerException

编辑
正如 IR42 所指出的那样,此解决方案将导致内存泄漏,而 就是

的原因

原始答案
空安全,但我认为使用 lateinit 是一个更好的解决方案

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

乍一看,lateinit 似乎是更自然的选择。但是,片段实例在 onDestroyView 之后仍然可用,因为片段实例可以被拆除并稍后重新附加。 lateinit 不会让您将参数改回未初始化状态,因此不适合此用途。

使用 !! 会导致 Kotlin NPE,这不是很好。我建议修改示例代码以提供更好的文档和错误报告,如下所示:

/** This property is only valid between onCreateView and onDestroyView. */
private val binding get() = _binding ?: 
    error("Binding is only valid between onCreateView and onDestroyView.")

但实际上,您的 Fragment 不会复杂到您无论如何都无法追踪到这样的错误。