在Android api级别27中将getContext()重写为非null是个坏主意?

在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

我正在使用kotlin,最近用compileSdkVersion/targetSdkVersion 27更新了我的应用程序。在那里我得到了一些编译错误,例如,上下文现在可以为null(context?)而不是非null。 我有一个基类fragment,其他片段从中继承。有这个功能是个坏主意吗

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,所以问题可能会在那里发生。