Dart中如何定义默认值为可增长列表的可选参数?
Dart中实现带可增长特性的可选参数方案
要解决这个问题,核心是绕开“可选参数默认值必须为常量”的限制,同时保证能得到可增长的列表,常用方案如下:
方案一:以null作为默认值,在初始化列表中处理
将可选参数设为可空类型,默认值指定为null(符合常量要求),然后在构造函数的初始化列表中,当参数未传入时,赋值一个新的可增长空列表。这样每个实例都会拥有独立的可增长列表,避免多个实例共享同一列表的问题。
修改后的代码:
import 'dart:io'; // 导入Directory所在的包 class DirectoryTree { final Directory directory; final List<DirectoryTree> children; DirectoryTree({ required this.directory, List<DirectoryTree>? children, }) : children = children ?? []; }
说明
List<DirectoryTree>? children:将参数声明为可空的可选参数,默认值隐式为null(也可显式写为children: null)children = children ?? []:使用空值合并运算符,若传入的children为null,则赋值一个新的可增长空列表[]
方案二:放弃const构造函数(若无需常量实例化)
如果你的类不需要作为常量实例化,可以去掉构造函数的const修饰符,但注意Dart中所有可选参数的默认值仍要求是编译时常量,直接写this.children = []依然会报错,因此方案一仍是更通用的解决方式。
如果坚持要在参数处指定默认值,只能使用不可增长的常量列表(但不符合可增长的需求),示例如下:
class DirectoryTree { final Directory directory; final List<DirectoryTree> children; DirectoryTree({ required this.directory, this.children = const [], // 不可增长的常量列表 }); }
这种方式的列表无法添加元素,显然不符合需求,因此方案一才是正确选择。
内容的提问来源于stack exchange,提问作者Fractale
相关产品推荐
相关产品推荐

