在Android api级别27中将getContext()重写为非null是个坏主意?
我正在使用kotlin,最近用compileSdkVersion/targetSdkVersion 27更新了我的应用程序。在那里我得到了一些编译错误,例如,上下文现在可以为null(context?)而不是非null。 我有一个基类fragment,其他片段从中继承。有这个功能是个坏主意吗在Android api级别27中将getContext()重写为非null是个坏主意?,android,android-fragments,kotlin,android-context,Android,Android Fragments,Kotlin,Android Context,我正在使用kotlin,最近用compileSdkVersion/targetSdkVersion 27更新了我的应用程序。在那里我得到了一些编译错误,例如,上下文现在可以为null(context?)而不是非null。 我有一个基类fragment,其他片段从中继承。有这个功能是个坏主意吗 override fun getContext(): Context { return super.getContext()!! } 在父函数中,我看到您有以下代码: /** * Return
override fun getContext(): Context {
return super.getContext()!!
}
在父函数中,我看到您有以下代码:
/**
* Return the {@link Context} this fragment is currently associated with.
*/
@Nullable
public Context getContext() {
return mHost == null ? null : mHost.getContext();
}
其中mHost是:
// Host this fragment is attached to.
FragmentHostCallback mHost;
但就我所见,片段将始终连接到主机。
是否存在mHost为空的场景
编辑:在支持库v27.1.0中,片段现在有requireContext()、requireResponsibility()、requireHost()和requireRefragmentManager()方法,这些方法返回等效get方法的非空对象或抛出IllegalStateException
请参见可能存在片段未连接到主机的情况。最简单的例子是,片段是用空构造函数实例化的,没有附加到任何东西上。如果在构造函数中调用
getContext()
(或从构造函数调用的方法),则会导致null
值
这意味着重写
getContext()
以返回super.getContext()
将毫无意义。您可能可以摆脱一些空检查,但如果它是null
,您的应用程序将崩溃。可能存在片段未连接到主机的情况。最简单的例子是,片段是用空构造函数实例化的,没有附加到任何东西上。如果在构造函数中调用getContext()
(或从构造函数调用的方法),则会导致null
值
这意味着重写
getContext()
以返回super.getContext()
将毫无意义。您可能可以摆脱一些空检查,但如果它是null
,您的应用程序将崩溃。原因是,在某些情况下,片段尚未附加到父级,但您尝试访问它,在这种情况下,上下文将为空。最好的例子是,当您有多个片段的选项卡,并且您在选项卡之间不断切换时,最可能的情况是,碎片将被分离并需要时间重新连接,但您已经切换到其他选项卡,导致您的应用程序崩溃。因此,保持上下文为空是最佳实践之一。原因是,在某些情况下,片段尚未附加到父级,但您尝试访问它,在这种情况下,上下文将为空。最好的示例是,当您有多个片段的选项卡,并且您在选项卡之间不断切换,最可能的情况是,碎片将被分离并需要时间重新连接,但您已经切换到其他选项卡,导致您的应用程序崩溃。因此,保持上下文为空是最佳实践之一。也许如果片段失去了状态,我能给出的最佳猜测也许如果片段失去了状态,我能给出的最佳猜测谢谢你的回答。谢谢你的回答。谢谢,好例子。我实际上使用了一个FragmentPagerAdapter,所以问题可能会出现在那里。谢谢,很好的例子。我实际上使用了一个FragmentPagerAdapter,所以问题可能会在那里发生。