关于Dart中的空安全,有一件事我无法完全理解,那就是如何安全地从Map<String,dynamic>中检索值(我已经从Dart文档中读取了常见问题 )。
基本上,启用空安全的DartPad中的以下代码是有效的:
void main() {
int i;
Map<String, dynamic> map = {"key": 1};
i = map["key"];
print(i);
}但我不明白。为什么我可以将map["key"]分配给i而不用编译器对我大喊大叫呢?来自文档
默认情况下,代码应该是安全的。如果您编写了新的Dart代码,并且不使用任何显式不安全的特性,则它不会在运行时抛出空引用错误。
但这确实发生了。如果在上面的代码中,键不在映射中,或者包含一些随机类型,程序就会在运行时崩溃,我认为这是空安全永远不应该发生的事情。
我对此特别感兴趣,因为我正在编写一个流畅的应用程序,并且不知道如何正确地反序列化从DB (try..catch )获取的JSON数据。特殊的语法,如??= ?)。即使我没有启用“非空”语言特性(我甚至不能在没有收到警告的情况下编写int? val ),但编译器似乎并不介意我将可空值分配给非空变量,并且如果它们为null,则会很高兴地在运行时崩溃。
基本上,我的问题不仅涉及空安全,而且涉及类型系统,因为据我理解,不应该将dynamic值赋值给int变量,但显然这适用于Map。任何解释都非常感谢!
发布于 2021-05-06 22:42:39
动态变量可以包含任何数据类型,如果不知道可能返回的特定数据类型,则使用" dynamic“关键字。
你在这里做的是:
I=映射“key”;
是将一个“动态”变量分配给一个"int“变量,而且由于dynamic在这种情况下,Map的键/值对中的值是一个整数,它与变量"i”的数据类型"int“匹配,它不会因为在运行时进行类型推断而不编译而崩溃。如果“动态”变量是一个字符串,它将在运行时崩溃,因为类型不匹配。希望这是解释性的。
https://stackoverflow.com/questions/67426531
复制相似问题