【问题标题】:Should ViewBinding properties in fragments always have a backing non-nullable property?片段中的 ViewBinding 属性是否应该始终具有支持的不可为空的属性?
【发布时间】:2021-08-08 04:30:50
【问题描述】:

我一直在阅读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 是可空的,因为对视图的引用将在onDestroyView() 中销毁。但是,他们使用 binding 作为支持属性,它检索 _binding 并使其不可为空(在 Kotlin 中调用强制展开的等效项)。

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

【问题讨论】:

  • “他们使用绑定作为支持属性” 反过来; binding_binding 的支持属性。

标签: android kotlin android-jetpack android-viewbinding


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      • 2021-06-10
      • 2011-01-13
      • 2012-11-30
      • 2012-02-20
      • 1970-01-01
      相关资源
      最近更新 更多