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 调用的值。另请注意,_binding
是 var
,这意味着它可以重新分配,而 binding
是 val
,这意味着它不能。所以在膨胀视图时尝试使用binding
不会编译。
最后,他们为什么使用binding
来获取视图还不清楚。可能只是为了使用binding
作为引用类绑定的单个属性的方便/一致性。使用_binding?.root
也可以。
【讨论】:
好的,谢谢!我想我现在正在关注这个。【参考方案2】:这是保护某人修改_binding
(如_binding = null
)的最佳做法,当您访问_binding
时出现错误,
您应该使用binding.root
而不是_binding.root
【讨论】:
以上是关于Kotlin 中的 Android Dev,被教程弄糊涂了的主要内容,如果未能解决你的问题,请参考以下文章
2018 写给开发者的 Kotlin 最完整的视频教程和资源
在 Android 视图模型中的内部网络更改回调时 LiveData 未触发 - Kotlin