繁体   English   中英

Dart:空安全和从地图中检索值

[英]Dart: Null-safety and retrieving values from maps

关于 Dart 中的空值安全性,我无法完全理解一件事,这涉及如何从Map<String,dynamic>安全地检索值(我已阅读 Dart 文档中的常见问题解答)。

基本上,启用 null-safty 的 DartPad中的以下代码是有效的:

void main() {
  int i;
  Map<String, dynamic> map = {"key": 1};
  i = map["key"];
  print(i);
}

我不明白。 为什么我可以在没有编译器对我大喊大叫的情况下将map["key"]分配给i 文档

默认情况下,代码应该是安全的。 如果您编写新的 Dart 代码并且不使用任何明确的不安全功能,则它永远不会在运行时引发 null 引用错误。

但正是这种情况正在发生。 如果在上面的代码中,密钥不在 map 中,或者包含一些随机类型,程序将在运行时崩溃,我认为这是 null 安全不应该发生的情况。

我对此特别感兴趣,因为我正在编写一个 Flutter 应用程序并且不明白如何正确反序列化我从数据库中获取的 JSON 数据( try..catch ?特殊语法,如??= ?)。 即使我没有启用“不可为空”语言功能(我什至不能在没有收到警告的情况下编写int? val ),编译器似乎并不介意我将可空值分配给不可为空的变量,如果它们是 null,它们会很高兴在运行时崩溃。

基本上,我的问题不仅涉及空安全性,而且涉及一般的类型系统,因为据我了解,它不应该为int变量分配dynamic值,但显然这适用于Map 非常感谢任何解释!

动态变量可以包含任何数据类型,当您不知道可能返回的特定数据类型时使用“动态”关键字。

以及你在这里实际做的事情:

我 = 地图[“钥匙”];

正在将“动态”变量分配给“int”变量,由于在这种情况下是动态的,因此 Map 的键/值对中的值是 integer,它与变量“i”的数据类型“int”匹配,因此不会由于在运行时而不是编译时完成的类型推断而崩溃。 如果“动态”变量是一个字符串,它会因为类型不匹配而在运行时崩溃。 希望这是解释性的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM