Dart列表中三元运算符搭配扩展运算符报错、if/else正常的原因是什么?
语法表现差异的核心原因
Dart 中的集合 if/else 是专门为集合字面量设计的内置语法糖,它的分支内容不需要作为完整表达式先求值,而是在编译期直接把匹配分支的内容插入到集合中,所以分支内既可以直接写单个元素,也可以写带...前缀的扩展内容,不需要统一返回类型。
而三元运算符?:是普通的条件表达式,它需要先计算出整个表达式的返回值,再把返回值作为一个整体放到集合中,语法规则上不允许把扩展运算符...嵌套在三元的分支内部。
编译错误的具体触发原因
你写的isLogged ? ...loggedRows(context) : loginRow(context)不符合Dart语法规范:
- 扩展运算符
...只能直接作为集合字面量的元素前缀使用,不能嵌套在普通表达式(三元运算属于普通表达式)内部,编译器读到? ...的时候无法识别...的语义,所以抛出「预期找到']'」「预期找到'.'」「预期存在标识符」这类语法解析错误。 - 就算你把
...移到外面,原来的两个分支返回类型也不统一:一个是List<ListTile>,一个是单个ListTile,类型不匹配也会触发编译错误。
三元运算符搭配扩展运算符的正确写法
你需要让三元表达式的两个分支统一返回List类型,再把扩展运算符加到整个三元表达式的外层即可,示例代码如下:
ListView( children: [ // 正确写法:三元整体返回List,在外层统一扩展 ...(isLogged ? loggedRows(context) : [loginRow(context)]), ListTile(...), ListTile(...), ] )
这个写法的逻辑是:
- 三元表达式先根据
isLogged的值返回对应的List:状态为真时返回loggedRows的多元素List,为假时返回包裹了loginRow的单元素List。 - 外层的
...把三元返回的整个List展开,插入到children数组中,完全符合语法要求。
内容的提问来源于stack exchange,提问作者Carlos
相关产品推荐
相关产品推荐

