Kotlin 中的 Android Dev,被教程弄糊涂了

Posted

技术标签:

【中文标题】Kotlin 中的 Android Dev,被教程弄糊涂了【英文标题】:Android Dev in Kotlin, confused by tutorial 【发布时间】:2021-05-11 14:04:40 【问题描述】:

我正在努力学习 kotlin 代码实验室中的一项 android 基础知识。我是一名初学者,为了好玩而在锁定中开始编程。

This is the tutorial in question

在教程的开头,它说要获取对绑定named_binding的可为空引用,然后使用

私有 val 绑定 get() = _binding!!

要获得它的版本,我们可以不使用 ?零安全的东西。到目前为止一切顺利。

但是在第四步中它显示了以下代码:

覆盖 fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? _binding = FragmentLetterListBinding.inflate(inflater, container, false) val view = binding.rootreturn view

为什么我们在分配视图时引用_binding来膨胀视图然后在下一行绑定?

【问题讨论】:

@Alex.T 在这种情况下是有道理的。这与官方文档中给出的在 Fragment 中设置绑定属性的建议相同。它的使用方式与requireContext() 类似。您打算仅在 Fragment 处于启动状态或更高状态时使用它,就像 requireContext() 【参考方案1】:

为什么我们在分配视图时引用_binding来膨胀视图然后在下一行绑定?

这里需要理解两个概念。

    _binding 被认为是 backing property - 即保存值的实际变量引用。在这种情况下,变量是 可为空的类型。 binding 是一个标准的属性 - 即提供对底层支持字段的访问的东西。在这种情况下,它使用_binding 作为支持属性,以便将_binding 公开为非空值。

所以 - 因为binding 只是将_binding 公开为非空值,所以必须首先设置_binding。所以这就是为什么它被分配了 inflate 调用的值。另请注意,_bindingvar,这意味着它可以重新分配,而 bindingval,这意味着它不能。所以在膨胀视图时尝试使用binding 不会编译。

最后,他们为什么使用binding 来获取视图还不清楚。可能只是为了使用binding 作为引用类绑定的单个属性的方便/一致性。使用_binding?.root 也可以。

【讨论】:

好的,谢谢!我想我现在正在关注这个。【参考方案2】:

这是保护某人修改_binding (如_binding = null)的最佳做法,当您访问_binding 时出现错误,

您应该使用binding.root 而不是_binding.root

【讨论】:

以上是关于Kotlin 中的 Android Dev,被教程弄糊涂了的主要内容,如果未能解决你的问题,请参考以下文章

Android快速转战Kotlin教程

2018 写给开发者的 Kotlin 最完整的视频教程和资源

Kotlin 环境安装及语法教程

在 Android 视图模型中的内部网络更改回调时 LiveData 未触发 - Kotlin

kotlin-android-extensions插件被废弃--解决办法

Kotlin for Android使用教程(一)