空检查不会导致 Dart 中的类型提升

2023-12-04

我正在升级一个基于Flutter框架的个人包。我注意到here在 Flutter Text 小部件源代码中存在空检查:

if (textSpan != null) {
  properties.add(textSpan!.toDiagnosticsNode(name: 'textSpan', style: DiagnosticsTreeStyle.transition));
}

然而,textSpan!仍在使用!操作员。不应该textSpan无需使用即可提升为不可空类型!操作员?但是,尝试删除该运算符会出现以下错误:

An expression whose value can be 'null' must be null-checked before it can be dereferenced.
Try checking that the value isn't 'null' before dereferencing it.

这是一个独立的示例:

class MyClass {
  String? _myString;
  
  String get myString {
    if (_myString == null) {
      return '';
    }
    
    return _myString; //   <-- error here
  }
}

我收到编译时错误:

错误:“字符串?”类型的值无法从函数“myString”返回,因为它的返回类型为“String”。

或者如果我尝试得到_mySting.length我收到以下错误:

无法无条件访问属性“length”,因为接收者可以为“null”。

我认为进行空检查会促进_myString为不可空类型。为什么不呢?

我的问题已在 GitHub 上解决,所以我在下面发布答案。


Dart 工程师 Erik Ernst在 GitHub 上说:

类型提升仅适用于局部变量。 ...实例变量的提升并不合理,因为它可能会被运行计算并在每次调用时返回不同对象的 getter 覆盖。比照。dart-lang/语言#1188有关与类型提升类似但基于动态检查的机制的讨论,以及一些相关讨论的链接。

所以本地类型的提升是有效的:

  String myMethod(String? myString) {
    if (myString == null) {
      return '';
    }
    
    return myString;
  }

但实例变量不是final那些不是私人的就不会得到晋升。 (在 Dart 3.2 之前,非局部变量从未得到提升。)为此,您需要手动告诉 Dart,在这种情况下,您可以使用以下命令来确定实例变量不为 null!操作员:

class MyClass {
  String? _myString;
  
  String myMethod() {
    if (_myString == null) {
      return '';
    }
    
    return _myString!;
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

空检查不会导致 Dart 中的类型提升 的相关文章

随机推荐

  • 在 Eclipse 中获取 Checkstyle 插件以使用您的自定义检查

    我写了一张自定义支票MethodLimitCheck java 我还有一个自定义配置文件myconfigurationfile xml其中包含以下内容 module name Checker gt
  • 如何禁用 React.js 中的按钮

    我有这个组件 import React from react export default class AddItem extends React Component add this props onButtonClick this in
  • Ruby on Rails 和优惠券模型

    我真的一直对此摸不着头脑 非常感谢您的帮助 我有一个商店 人们可以在那里学习课程 我有课程模型 订单模型和优惠券模型 这是模型中的关联 class Course lt ActiveRecord Base belongs to categor
  • 按下<按钮>选择器

    我想创建一个button当它被按下时会改变它的风格 这是我的 CSS 代码 button font size 18px border 2px solid gray border radius 100px width 100px height
  • java.lang.NoSuchMethodError: org.springframework.web.context.ConfigurableWebApplicationContext.setId(Ljava/lang/String;)V

    下面是我的 Spring Batch 项目的 pom xml 如果我部署在 jboss 5 中 我会得到以下异常 但如果我部署在本地 Windows 机器中 同样的战争工作正常 我怀疑 jar 中存在冲突org springframewor
  • vscode 和 Visual Studio 之间的正则表达式差异

    vscode 和 Visual Studio 之间的正则表达式差异 从 开始 line1 line2 查找 替换 1 在 vscode 中它按预期工作 结果是 line1 line2 在工作室里 似乎不起作用 导致 line1 line2
  • 为什么要在 Java 中调用 super() ?

    我在一本关于java的书中看到了一个例子 public class A public A System out println A public class B extends A public B super System out pri
  • 打开项目会更改 iis 设置

    我有这个问题 在开发时我使用 git 并经常克隆到一个新文件夹来修复较小的错误 问题是 一旦我打开项目 Visual Studio 就会更改 IIS 设置以指向新文件夹 有什么办法可以防止这种情况发生吗 比如打开项目时按住ctrl键什么的
  • 如何在 android 中向 EditText 添加分页行?

    是否可以在a中显示分页行EditText 我的意思是这些行 就说我的EditText大小为 500 x 500 像素 我希望这些线条在 500 x 500 的正方形中可见 有没有一种构建方法可以做到这一点 我已经尝试过谷歌但找不到答案 我想
  • JLayer Mono Mp3 到 PCM 解码

    我目前正在使用 javalayer 1 1 进行 mp3 解码 所以我想从我的 44100 Hz 16 位 Mp3 接收原始 PCM 数据 它与立体声 mp3 完美配合 但我在单声道 mp3 上遇到奇怪的问题 这里有一些代码 InputSt
  • 如何通过 Excel 网络查询从 Google Directions API 提取距离?

    我在 Excel 中有一个长长的出发地和目的地列表 使用 webquery 我可以填写城市和邮政编码以提供如下 webquery 这会返回一个很长的 XML 文件 但我需要的只是距离 有没有办法只提取距离值 或者我应该运行一个宏脚本来一一提
  • 为什么alert出现在document.write之前?

    当按照编写的顺序执行以下代码时 为什么警报仍然在第一个 即使它在第二行 谢谢 document write Hello World alert You wrote to the document Javascript 被解释 所以它是逐行执
  • 使用保存的模型对象进行预测

    我正在尝试使用之前保存的模型来使用 R 中的预测函数 使用以下代码创建并保存模型 lrModel1 lt glm response data modelData family binomial model TRUE save lrModel
  • 如果元素中有内容,如何在 Javascript/jQuery 中添加类?

    我正在开发一个网站 我想检查元素中是否有任何内容 下面是我的 html 代码 我已经提到过条件 1 where opacity pointseven如果类应该通过脚本添加类featured block title and featured
  • jPanel 的背景图像不工作

    我是制作 GUI 的新手 所以我决定尝试使用 Eclipse 的 Windows 构建器 虽然很棒 但我确实有一些疑问 我一直在寻找 但我找不到找到将背景图像添加到我的 菜单 的好方法 例如我尝试过这个 public Menu setDef
  • C# 在两个数字之间切换?

    我正在尝试制作一个智能 switch 语句 而不是使用 20 多个 if 语句 我试过这个 private int num switch num case 1 10 Return number is 1 through 10 break d
  • Mongo 查询失败,错误代码为 13 并显示错误消息“未授权”

    当我尝试对 mLab 上的 mongo 实例进行查询时发生错误 我从 Spring Boot 应用程序请求它 与数据库的连接稳定 下面是来自控制台的日志 监视器线程成功连接到服务器 描述为 ServerDescription address
  • 将Web应用程序部署到iis时出现问题

    使用 webmatrix 构建了一个 Web 应用程序 尝试在本地部署到 iis 5 1 以进行测试 因此我将其添加到我的 wwwroot 文件夹中不起作用 然后我创建了一个虚拟目录 主页可以使用此功能 但我使用网络助手创建的登录名不起作用
  • PowerShell:-替换、正则表达式和 ($) 美元符号问题

    我正在将数千行批处理代码转换为 PowerShell 我正在使用正则表达式来帮助完成此过程 问题的部分代码是 2 更换后仅显示 2并且不会扩展变量 我还对替换的第二部分使用了单引号 而不是转义变量 结果相同 origString IF I
  • 空检查不会导致 Dart 中的类型提升

    我正在升级一个基于Flutter框架的个人包 我注意到here在 Flutter Text 小部件源代码中存在空检查 if textSpan null properties add textSpan toDiagnosticsNode na