自从我将项目更新为SDK版本27并将支持库的gradle插件更新为版本27.0.0
后,我需要更改我的代码。
使用26.1.0
我可以在getContext()
(context
)中使用Fragment
(与Kotlin android.support.v4.app
),我没有可空性问题,但是我使用Kotlin我的版本27.0.0
有问题,我的所有context
调用都不再有效,我需要一个安全运算符,如context!!
,但因为我个人觉得它是一个每次我做自己的工作时都要努力做到这一点
override fun getContext() = super.getContext()!!
另一件改变的事情(突然,这就是我要问的原因)是方法onCreateView()
和onViewCreated()
。在onCreateView
中,inflater不再可能为null,因此我需要更改我的函数签名,以便从onCreateView(inflater: LayoutInflater?...)
正确覆盖到onCreateView(inflater: LayoutInflater...)
,并且createdView
参数中的onViewCreated
参数相同{1}}。
所以现在我想知道为什么,特别是(对于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
返回类型Context?
。
答案 0 :(得分:36)
这些是故意的改变。在此版本的支持库之前,这些类没有可空性注释,因此从Kotlin开始,所有这些类型都只是intrinsic。在27,他们添加了必要的注释,所以现在这些类型在Kotlin中肯定被标记为可空或不可空 - 没有必要猜测它们是否可以null
。
至于你提到的具体方法:
getActivity
和getContext
方法返回可空类型,因为当Fragment
未附加到Activity
时,这些方法已经返回null
。行为没有变化,现在只是明确标记,所以你可以安全地处理它。inflater
方法的onCreateView
参数曾经是平台类型,因此您是否将其标记为可为空是由您决定的。由于永远不会使用null
调用它,因此它已明确注释为@NonNull
,因此其在Kotlin中的类型现在严格为LayoutInflater
而不是“宽松”LayoutInflater!
类型编辑:从支持库27.1.0开始,您可以使用返回非可空类型的platform types和requireActivity
方法,并注意它们会抛出{{1}当常规方法返回IllegalStateException
时。