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 调用确保即使 arguments
或 getString()
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) String
和 type
未放入 arguments
Bundle
.
getString()
returns 可为 null 的字符串的方法签名。这是因为在编译时,编译器无法知道该值是否存在于 bundle 中。从任何地图检索任何内容时,您都会遇到同样的问题。
如果您确定调用 getString()
时 bundle 或映射中的值应该存在,则可以使用 !!
运算符。这就是它的用途。当您 知道 某些东西应该始终存在时,如果它不存在则抛出异常(在本例中为 KNPE)是合适的,这样您可以在测试期间轻松发现任何编程错误。
isEmpty()
或 ?.let
在这种特殊情况下没有帮助,因为它们只会掩盖编程错误并使其更难发现或调试。
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 调用确保即使 arguments
或 getString()
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) String
和 type
未放入 arguments
Bundle
.
getString()
returns 可为 null 的字符串的方法签名。这是因为在编译时,编译器无法知道该值是否存在于 bundle 中。从任何地图检索任何内容时,您都会遇到同样的问题。
如果您确定调用 getString()
时 bundle 或映射中的值应该存在,则可以使用 !!
运算符。这就是它的用途。当您 知道 某些东西应该始终存在时,如果它不存在则抛出异常(在本例中为 KNPE)是合适的,这样您可以在测试期间轻松发现任何编程错误。
isEmpty()
或 ?.let
在这种特殊情况下没有帮助,因为它们只会掩盖编程错误并使其更难发现或调试。