You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dart可空类型检查在字符串插值中使用触发报错

Dart字符串插值中使用is String?判断报编译错误的问题

复现场景

在Dart 2.12.4版本中,单独书写可空类型判断逻辑时,代码可以正常编译运行:

String? firstName, lastName;

firstName = 'John';

bool firstNameIsNullableString = firstName is String?; // true
bool lastNameIsNullableString = lastName is String?; // true
bool firstNameIsString = firstName is String; // true
bool lastNameIsString = lastName is String; // false

上述逻辑中,分别对已赋值的可空字符串变量firstName、未赋值的可空字符串变量lastName做类型校验,is String?、is String的判断结果均符合预期。

但如果将相同的类型判断表达式通过${}嵌入字符串插值使用,会直接抛出编译错误:

print('firstName is of type: String? ${firstName is String?}');

对应编译报错信息如下:

file.dart:7:62: Error: Expected an identifier, but got '}'.
Try inserting an identifier before '}'.
  print('firstName is of type: String? ${firstName is String?}');

报错原因

Dart语法解析器处理${}包裹的插值表达式时,会将表达式中出现的?优先识别为三元条件运算符、可空成员访问运算符的组成部分,不会自动将其判定为可空类型声明的后缀。
当解析器读到${firstName is String?}这段内容时,会把String后的?当做运算符开头,认为后续应该跟对应分支的表达式内容,结果直接碰到了插值结束标记},因此抛出“期望标识符却遇到}”的错误。

解决方法

有两种常用修复方案:

  • 给插值内的完整类型判断表达式加小括号,强制解析器将括号内的内容识别为一个完整的布尔运算表达式:
    print('firstName is of type: String? ${(firstName is String?)}');
    
  • 提前将类型判断的结果存入变量,再把变量传入字符串插值,这种写法可读性更高:
    bool check = firstName is String?;
    print('firstName is of type: String? $check');
    

内容的提问来源于stack exchange,提问作者Arslan Ali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 15:27:23