Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android fragments Kotlin Bundle.putString未明确添加";“字符串”;但事实上,它是;字符串;_Android Fragments_Kotlin_Bundle - Fatal编程技术网

Android fragments Kotlin Bundle.putString未明确添加";“字符串”;但事实上,它是;字符串;

Android fragments Kotlin Bundle.putString未明确添加";“字符串”;但事实上,它是;字符串;,android-fragments,kotlin,bundle,Android Fragments,Kotlin,Bundle,我很困惑,为什么在接收片段中,当我访问我传递的参数时,它会用 val args = Bundle() args.putString("type", details.type) navigator.navigate(context!!, findNavController(), Destination.TYPE, args) arguments.getString都带红色下划线,并表示“Required String Found String?”但当我调用方法“putString” 这会导致文

我很困惑,为什么在接收片段中,当我访问我传递的参数时,它会用

val args = Bundle()
args.putString("type", details.type)

navigator.navigate(context!!, findNavController(), Destination.TYPE, args)
arguments.getString都带红色下划线,并表示“Required String Found String?”但当我调用方法“putString”


这会导致文本无法在新片段中呈现,我认为这是一个可空性问题。

你是对的,这是一个:可空性问题


首先,您应该确定是否需要一个值,因此请尝试添加“?”或“!!”,我建议使用“?”,或使用if{}else的块来安全地读取字符串,您可以使用:

val type: String = arguments.getString("type")

末尾的orEmpty调用确保返回有效字符串,即使
参数
getString()
返回null。

接收
片段
中提供了相关知识

片段
不知道它的
参数
是如何创建(或修改)的,因此它必须假设您要查找的
“type”
键可能不在arguments
包中。这就是为什么它返回一个
null
String?
)结果(
null
值意味着在参数中不存在)

您的片段可能在应用程序中的多个位置创建,其参数可能在多个位置被修改。我们没有办法追踪


对于这个问题有不同的解决方案,这取决于您在代码的其他部分中的方法以及您在创建
片段时的“信心”

我通常会选择一种解决方案,在该解决方案中,我假设
类型的设置是强制的。因此,如果
类型
不存在,我会快速失败。这意味着
片段被误用了

val类型:String=arguments!!。getString(“类型”)!!
如果出现以下任一情况,上述代码将崩溃:

a) 未设置参数
,或者


b)
字符串
类型
未放入
参数
捆绑包
getString()
的方法签名返回可为空的字符串。这是因为在编译时,编译器无法知道该值是否存在于包中。从任何地图检索任何内容时,都会遇到相同的问题

如果在调用
getString()
时确定捆绑包或映射中的值应该存在,则可以使用
操作员。这就是它的目的。当您知道应该始终存在某个异常时,如果它不存在,则希望抛出一个异常(在本例中为KNPE),这样您就可以在测试期间轻松找到任何编程错误


isEmpty()
?。在这种情况下,let
没有帮助,因为它们只会掩盖编程错误,使其更难发现或调试。

感谢您的帮助。当我有
参数时?.getString(“type”)
会运行,但会提到推断的类型是String?当需要字符串时。如果我试图记录新片段返回的内容,它会崩溃。同时添加
参数!!。getString也会使应用程序崩溃。。。令人困惑的是,推断的类型是正确的-然后它只会在使用putString时推断类型似乎很奇怪编译器不知道您是否使用了
putString
。此外,您的片段可以在其他地方创建,使用不同的参数或没有参数。要点是:
getString
函数返回
String?
,因此您必须处理它返回null的情况。它没有进入这些调用的“逻辑”,它只看到单个函数。@Tony,试着像我前面提到的那样处理这个案例。还建议尝试添加一次:details.type.toString()谢谢!从总体上看,这似乎是一种看待碎片的好方法。失败很快。我喜欢:)
val type: String = arguments?.getString("type").orEmpty()