【问题标题】:What is the difference between binding and _binding?绑定和_绑定有什么区别?
【发布时间】:2021-06-25 02:36:44
【问题描述】:

我试图了解片段中视图绑定的实现,我发现它与活动不同。

在活动中:

private lateinit var binding: ResultProfileBinding

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ResultProfileBinding.inflate(layoutInflater)
    val view = binding.root
    setContentView(view)
}

在片段中:

private var _binding: ResultProfileBinding? = null
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_binding?这条线在做什么,它的目的是什么?

private val binding get() = _binding!!

【问题讨论】:

    标签: android kotlin android-databinding android-viewbinding


    【解决方案1】:

    在第二个示例中,_binding 属性可以为空,以便在“初始化”之前允许状态。然后 binding 属性有一个 getter 以提供方便的访问,因为支持字段 (_binding) 已被初始化。

    您所指的特定行意味着当您尝试访问binding 时,它将返回_binding。然而,空断言运算符(!!)添加了_binding 不为空的额外断言。

    实际上,您所做的只是创建了 lateinit 属性的类似物,实际上,如果您查看 lateinit 声明的反编译字节码,它们的数量是相同的。

    然而,正如@Tenfour04 所指出的,这里的细微差别是第二种方法允许您将支持字段设置回null,而您不能使用lateinit 执行此操作财产。当您在片段中使用绑定时,建议将 onDestroyView 中的绑定清空以避免内存泄漏,因此这就是他们在片段中采用这种方法的原因。

    【讨论】:

    • 如果说是两种不同的方法..我们也可以在片段中遵循方法1吗? @亨利
    • 在什么情况下方法 2 是合适的?你能举个例子吗@Henry Twist
    • 由于Activity在视图被销毁时也被销毁,因此无需担心视图泄漏,因此可以使用更简洁的lateinit。因此,文档中使用不同策略的原因与活动与片段有关。
    • lateinit 比单独的 !! 强制属性更安全,因为您不会意外得到 NullPointerException。使用单独的 !! 强制属性,您必须小心不要在片段被销毁后可能被调用的回调中使用它。 Google 建议使用 !! 强制属性,以便您可以在视图被销毁时将支持绑定属性更改回 null。这可以防止绑定中的视图在分离片段期间暂时泄漏。
    • 在实践中,片段处于分离状态的时间非常短——不到一秒。要么即将被销毁,要么在屏幕旋转后即将被重新使用。所以我认为许多有经验的开发人员会说!! 强制属性是矫枉过正的。使用lateinit 更简单,理论上也更安全,尽管如果您在分离状态下访问视图,我会说您很草率。 @JCarlosR
    猜你喜欢
    • 2011-01-03
    • 1970-01-01
    • 2013-05-23
    • 2012-12-02
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    相关资源
    最近更新 更多