如开发人员文档中所述,使用以下模式有什么好处
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 不会复杂到您无论如何都无法追踪到这样的错误。
我正在浏览有关数据绑定的开发人员文档。我找到了以下片段:
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 不会复杂到您无论如何都无法追踪到这样的错误。