Android 使用开发人员文档中描述的以下模式有什么好处

Android 使用开发人员文档中描述的以下模式有什么好处,android,kotlin,design-patterns,coding-style,android-databinding,Android,Kotlin,Design Patterns,Coding Style,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: LayoutInflate

我正在浏览开发人员文档以进行数据绑定。我发现了以下代码片段:

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
是一个非空属性,具有可空的支持字段,因此当您访问它时,您不必经常使用
来检查可空性

但是,如果在注释中描述的无效时访问它,它将抛出
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.")

但实际上,您的片段不会太复杂,以至于您无法追踪这样的错误。

即使我觉得lateint也会如此better@Keshav1234您应该在
onDestroyView
中释放
\u binding
属性,但不能使用
lateinit
property@IR42你确定?在谷歌的网站上,他们不会发布它,而且这应该是一个最佳实践Jetpack@Stachu因此,当您从
GardenFragment
fragment移动到另一个
android.widget.FrameLayout实例时,它们会出现内存泄漏​ 泄漏:是的(ObjectWatcher正在监视此操作,因为com.google.samples.apps.sunflower.GardenFragment接收到片段#onDestroyView()回调(应清除对其视图的引用以防止泄漏)和视图分离并具有父级)
lateinit更适合,而不是使用重复的变量,对吗?它们是属性,不是变量。这种区别在这里很明显,因为附加属性不会导致附加的支持字段变量。这是否回答了您的问题@user4157124我的问题与开发人员文档中使用的模式有关,这与内存泄漏直接相关,可能看起来很相似,但我感觉不完全一样。