首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Dart:空安全和从地图中检索值

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

Stack Overflow用户
提问于 2021-05-06 22:06:51
回答 1查看 1.3K关注 0票数 2

关于Dart中的空安全,有一件事我无法完全理解,那就是如何安全地从Map<String,dynamic>中检索值(我已经从Dart文档中读取了常见问题 )。

基本上,启用空安全的DartPad中的以下代码是有效的:

代码语言:javascript
运行
复制
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。任何解释都非常感谢!

EN

回答 1

Stack Overflow用户

发布于 2021-05-06 22:42:39

动态变量可以包含任何数据类型,如果不知道可能返回的特定数据类型,则使用" dynamic“关键字。

你在这里做的是:

I=映射“key”;

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67426531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档