片段中的 ViewBinding 属性是否应始终具有不可为 null 的支持 属性?

Should ViewBinding properties in fragments always have a backing non-nullable property?

我一直在阅读 https://developer.android.com/topic/libraries/view-binding 并在思考他们如何在片段中定义视图绑定 属性。

这是示例代码:

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 可以为 null,因为对视图的引用将在 onDestroyView() 中被销毁。但是,他们使用 binding 作为支持 属性,它检索 _binding 并使其不可为 null(无论在 Kotlin 中调用什么等同于强制解包)。

问题是为什么要有_bindingbinding,应该用哪一个?感觉就像如果你试图让 _binding 可以为空,那么为什么要用 binding 使它本质上不可为空并在它被销毁时冒着访问视图的风险?

这背后的原因是当您确定您不会在onCreateView之前尝试访问视图时,使代码更易于阅读和维护,并且在 onDestroyView 之后。非空 属性 避免了不必要的 ?!! 空安全运算符,每次您尝试到达绑定时。

另一方面,如果您不确定您的调用顺序并且可能在视图被销毁时尝试访问片段视图,则您不需要这样做额外的步骤并将您的绑定实例放在支持 属性 中。在这种情况下,空安全是你最亲密的朋友。

_bindingnullable 以便它可以在 onDestroyView 中设置为 null,避免任何 memory leaks。但是,如果您尝试使用 _binding 访问视图,则每次访问任何视图时都必须编写 _binding!!.someView,使用非空断言 (!!) 很快就会变得多余和冗长。

因此,要删除此冗余,可以使用不可为空的 binding。现在您可以作为 binding.someView 访问您的视图,无需使用非空断言 (!!)。这不会导致任何问题,因为只能在 onCreateViewonDestroyView 之间访问视图。