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()