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

Sma*_*mer 8 android kotlin android-jetpack android-viewbinding

我一直在阅读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
}
Run Code Online (Sandbox Code Playgroud)

可为空也是如此_binding,因为对视图的引用将在 中被销毁onDestroyView()。然而,它们用作binding支持属性,它检索_binding并使其不可为 null(无论 Kotlin 中调用的强制展开的等效项是什么)。

问题是为什么我们应该拥有_binding以及binding应该使用哪一个?感觉就像如果您试图使其可为_binding空,那么为什么要使其本质上不可为空binding并在视图被销毁时冒险访问视图呢?

mig*_*WOZ 7

_binding这样就nullable可以将其设置为 null onDestroyView,避免任何内存泄漏。但是,如果您尝试使用_bindingthen 访问视图,则每次访问任何视图时都必须编写_binding!!.someView,使用非空断言(!!)很快就会变得多余且冗长。

因此,为了消除这种冗余,需要使用 non-nullable binding。现在您可以访问您的视图binding.someView,无需使用非空断言(!!)。这不会导致任何问题,因为视图只能在onCreateView和之间访问onDestroyView