Kotlin Bundle.putString 没有明确添加 "String" 而是 "String?"

Kotlin Bundle.putString not explicitly adding "String" but instead is "String?"

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

navigator.navigate(context!!, findNavController(), Destination.TYPE, args)

我很困惑为什么在接收片段中访问我传递的参数时它会响应...

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

arguments.getString 都是带红色下划线的 "Required String Found String?" 但是当我调用方法 "putString" 时怎么办?!?

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

你说的对,就是:空能力问题

首先你应该确定你是否期待一个值,所以尝试添加“?”或“!!”,我会推荐“?”,或者使用 if {} else

要安全地读取字符串,您可以使用:

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

末尾的 orEmpty 调用确保即使 argumentsgetString() returns null.

接收中可以得到的知识Fragment.

Fragment 不知道它的 arguments 是如何创建(或修改)的,因此它必须假定您要查找的 "type" 键可能不在参数 Bundle。这就是为什么它 returns 一个 nullable (String?) 结果(null 值在参数中意味着 不存在 )。

您的片段可能在您应用的许多地方创建,并且它的参数可能在许多地方被修改。我们无法追踪。


此问题有不同的解决方案,具体取决于您在代码其他部分的方法以及您 "confident" 创建 Fragment.

的方式

我通常会选择一种解决方案,我假设设置 type 强制性 。因此,如果 type 不存在 - 我很快就会失败。这意味着 Fragment 被滥用了。

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

如果出现以下情况,上面的代码将崩溃:

a) arguments 未设置,或

b) Stringtype 未放入 arguments Bundle.

getString() returns 可为 null 的字符串的方法签名。这是因为在编译时,编译器无法知道该值是否存在于 bundle 中。从任何地图检索任何内容时,您都会遇到同样的问题。

如果您确定调用 getString() 时 bundle 或映射中的值应该存在,则可以使用 !! 运算符。这就是它的用途。当您 知道 某些东西应该始终存在时,如果它不存在则抛出异常(在本例中为 KNPE)是合适的,这样您可以在测试期间轻松发现任何编程错误。

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