Android支持库 27、Fragment更新?

Android support library 27, Fragment update?

由于我将我的项目更新为 SDK 版本 27,并将支持库的 gradle 插件更新为版本 27.0.0,因此我需要更改我的代码。

使用 26.1.0 我可以在我的 Fragment (android.support.v4.app) 中使用 getContext()(使用 Kotlin context)并且我没有可空性问题,但是因为我使用 Kotlin,所以我的版本 27.0.0 有问题,我所有的 context 调用都不再工作了,我需要一个安全操作员,比如 context!!,但是因为我个人发现它每次我自己做我的变通方法时都要努力做到这一点

override fun getContext() = super.getContext()!!

另一件发生变化的事情(突然发生,这就是我要问的原因)是方法 onCreateView()onViewCreated()。在 onCreateView 中,inflater 可能不再为 null,所以我需要更改我的函数签名以正确地从 onCreateView(inflater: LayoutInflater?...) 覆盖到 onCreateView(inflater: LayoutInflater...) 并且 createdView 参数也是如此 onViewCreated.

所以现在我想知道为什么,尤其是(对于 Kotlin)非常难看的 getContext() 更改并转到 https://developer.android.com/sdk/support_api_diff/27.0.0/changes.html

但是等等,显然他们没有改变吗?所以现在我的问题是,如果我做错了什么,或者他们是否真的改变了它,如果是的话,我可能会问他们为什么?

顺便说一句,同样适用于 getActivity(),我认为添加了 mHost == null 检查并且 getActivity 方法甚至是最终方法,所以我不能在那里使用我的解决方法,这使它非常非常难看。实际上在源文件中,方法看起来是一样的,但是 26.1.0 有 Kotlin return 类型 Context!27.0.0 return 类型 Context?.

这些是有意更改。在此版本的支持库之前,这些 类 没有可空性注释,因此在 Kotlin 中,所有这些类型都只是 platform types。在 27 中,他们添加了必要的注释,因此现在这些类型在 Kotlin 中明确标记为可空或不可空 - 无需猜测它们是否可以 null.

至于你提到的具体方法:

  • getActivitygetContext 方法 return 可空类型,因为当 Fragment 未附加到 Activity 时,这些方法已经 returned null。行为没有变化,现在只是明确标记,因此您可以安全地处理它。
  • onCreateView 方法的 inflater 参数曾经是平台类型,因此是否将其标记为可空由您决定。由于它永远不会用 null 调用,它已被显式注释为 @NonNull,因此它在 Kotlin 中的类型现在是严格的 LayoutInflater 而不是 "looser" LayoutInflater!类型。

编辑:从支持库 27.1.0 开始,您可以使用 requireActivity and requireContext 方法,其中 return 不可空类型,但需要注意的是它们会抛出 IllegalStateException 当常规方法 return null.