由于我将项目更新到 SDK 版本 27 并将支持库的 gradle 插件更新到版本 27.0.0
我需要更改我的代码。
使用 26.1.0
我可以在我的 Fragment
中使用 getContext()
(使用 Kotlin context
) (android.support.v4.app
) 并且我没有可空性问题,但由于我使用 Kotlin,我的版本 27.0.0
有问题,我的所有 context
调用不再起作用了,我需要一个安全操作符,比如 context!!
,但是因为我个人觉得每次我自己做的时候都需要很忙,所以我变通了功能
override fun getContext() = super.getContext()!!
另一件改变(突然,这就是我要问的原因)是方法 onCreateView()
和 onViewCreated()
。在 onCreateView
中,inflater 不再可能为空,因此我需要更改我的函数签名以正确覆盖从 onCreateView(inflater: LayoutInflater?...)
到 onCreateView(inflater: LayoutInflater...)
和 onViewCreated
中的 createdView
参数相同。
所以现在我想知道为什么,尤其是(对于 Kotlin)非常丑陋的 getContext()
更改并转到 https://developer.android.com/sdk/support_api_diff/27.0.0/changes.html .
但是等等,显然他们没有改变它?所以现在我的问题是我做错了什么,或者他们是否真的改变了它,如果是这样,我可能会问他们为什么?
顺便说一句,同样适用于 getActivity()
,我认为添加了 mHost == null
检查并且 getActivity
方法是即使是最终的,所以我不能在那里使用我的解决方法,这使得它非常难看。实际上在源文件中的方法看起来是一样的,但是 26.1.0
有 Kotlin 返回类型 Context!
和 27.0.0
返回类型 上下文?
.
最佳答案
这些都是故意的改变。在此版本的支持库之前,这些类没有可空性注释,因此从 Kotlin 中,所有这些类型都只是 platform types .在 27 中,他们添加了必要的注解,所以现在这些类型在 Kotlin 中明确标记为可空或不可空 - 无需猜测它们是否可以为 null
。
至于你提到的具体方法:
getActivity
和getContext
方法返回可空类型,因为当Fragment
未附加到Activity
时,这些方法已经返回null
。行为没有变化,只是现在明确标记,因此您可以安全地处理它。onCreateView
方法的inflater
参数曾经是一种平台类型,因此是否将其标记为可空取决于您。由于它永远不会被null
调用,它被显式注释为@NonNull
,所以它在 Kotlin 中的类型现在严格地是LayoutInflater
而不是“更宽松”的LayoutInflater!
类型。
编辑:从支持库 27.1.0 开始,您可以使用 requireActivity
和 requireContext
方法,它们返回不可为空的类型,但需要注意的是,当常规方法返回 null
时,它们会抛出 IllegalStateException
。
关于Android 支持库 27、Fragment 更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47250787/