当前位置: 首页 > news >正文

Flutter 的 switch 语句补遗

我的 App 里,一个消息气泡变成空白了,非常奇怪,此前一直是没问题的,经过调试定位我发现:

  static TextSpan _buildRootSpan(BuildContext ctx, List<LinkifyElement> parts, TextStyle? style) {List<InlineSpan> children = [];for (var p in parts) {switch (p.runtimeType) {case TextElement _:children.add(TextSpan(text: p.text));break;case UrlElement _:var url = p as UrlElement;var recognizer = TapGestureRecognizer();recognizer.onTap = () {AutoRouter.of(ctx).push(WebRoute(targetUrl: url.url));};children.add(TextSpan(text: url.text,style: TextStyle(color: Theme.of(ctx).colorScheme.secondary,decoration: TextDecoration.underline,decorationColor: Theme.of(ctx).colorScheme.secondary,),recognizer: recognizer,));break;}}return TextSpan(style: style,children: children,);}

问题出在这段代码里,最后的 TextSpan 返回的内容是空的。怎么会如此呢?从没改过这段代码。加了很多 Log 后,我发现,Switch 语句的所有 case 都没命中!我对 p.runtimeType 进行 switch 判断,但是明明类型没错,但是就是不命中。

问了一下 ChatGPT,给出了明确答案:

在 Dart 中,你不能直接在 switch 语句中对类型进行判断,因为 switch 语句要求其表达式的结果必须是编译时常量,而类型检查(使用 is 关键字)不满足这个条件。但是,你可以使用一些替代方案来根据对象的类型执行不同的逻辑。

一种常见的做法是使用 if 语句和 is 类型检查操作符,像这样:

void performAction(Object obj) {if (obj is TypeA) {// 处理 TypeA} else if (obj is TypeB) {// 处理 TypeB} else {// 处理其他类型}
}

另一种方法是使用 Dart 2.15 引入的 switchcase 语法的增强特性,结合枚举和 when 函数(如果你定义了一个这样的函数),你可以模仿类型判断的行为。虽然这不是直接的类型判断,但它允许你在相似的上下文中根据不同的条件执行不同的代码块,特别是当你处理的是固定集合中的值时。

如果你真的需要根据类型来分支逻辑,使用 if-is 检查可能是最直接和最清晰的方式。 Dart 的类型系统和 is 操作符非常强大,可以满足大多数需要类型判断的场景。

说实在的,我觉得我穿越了,代码一直是这样的,也没改过,功能正常也好多个版本了,怎么突然就跟我说,dart 压根不支持对类型进行 switch 这不是搞笑么???

改成 ifis 后,立刻全部正常了,我服了。引以为戒吧。

又查了点资料,感觉跟 3.0 新语法有关: Dart 3.0 语法新特性 | switch 匹配加强

http://www.lryc.cn/news/318986.html

相关文章:

  • Linux动态库*.so函数名修改
  • adb shell 指令集
  • 【电子通识】CH340C与CH340G的区别
  • 基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的吸烟检测系统(深度学习+Python代码+PySide6界面+训练数据集)
  • Apache Paimon 使用之 Lookup Joins 解析
  • GO语言-切片底层探索(下)
  • 物理隔离条件下,如何安全高效地进行内外网文件导入导出?
  • 代码随想录 贪心算法-难度题目-区间问题
  • 地理数据 vs. 3D数据
  • Redis删除
  • 力扣细节题:字符串中的最大奇数
  • Unity PS5开发 天坑篇 之 申请开发者与硬件部署01
  • 十四届蓝桥杯省赛Java B组 合并区域
  • SpringBoot高级
  • 机试:偶数分解
  • 一周学会Django5 Python Web开发-Jinja3模版引擎-安装与配置
  • python前端开发
  • web学习笔记(三十三)
  • flask库
  • 专业无网设备如何远程运维?向日葵远程控制能源场景案例解析
  • 基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的稻田虫害检测系统详解(深度学习+Python代码+UI界面+训练数据集)
  • 实现upt下客户端用tftp文件传输协议编写客户端发送下载文件
  • 什么软件可以改ip地址
  • C#,文字排版的折行问题(Word-wrap problem)的算法与源代码
  • VUE+VScode+elementUI开发环境
  • 第十四届蓝桥杯省赛真题 Java A 组【原卷】
  • 可视化展示与交互编辑:探索3D Web轻量化平台HOOPS WEB Platform在BIM中的新可能性
  • Linux(centos)环境下安装Nginx的步骤文档
  • AI毕业论文降重GPTS,避免AI检测,高效完成论文
  • 什么是线程死锁?形成死锁的四个必要条件是什么?如何避免线程死锁?