Dart如何初始化Set变量?构造函数Set参数不加required报错怎么解决
Dart/Flutter Set类型可选构造参数报错解决方案
报错原因
Dart 2.12及以上版本默认启用空安全机制,你声明的final Set<V> initialSelectedValues属于非空类型,作为可选命名参数时如果没有设置默认值,编译器会强制要求添加required注解,要求调用方必须传参。
解决方案
方案1:声明为可空类型(适合需要区分「未传参」和「主动传空Set」的场景)
把initialSelectedValues的类型改为可空的Set<V>?,使用时先判空或者设置 fallback 值即可:
class MultiSelectDialog<V> extends StatefulWidget { MultiSelectDialog({required this.items, this.initialSelectedValues}); final List<MultiSelectDialogItem<V>> items; final Set<V>? initialSelectedValues; // 类型后加?声明可空 @override State<StatefulWidget> createState() => _MultiSelectDialogState<V>(); }
在状态类中使用时,可以通过??运算符设置默认值:
// 示例:如果未传initialSelectedValues则默认使用空Set final usedValues = widget.initialSelectedValues ?? <V>{};
调用时可以完全省略该参数:
final selectedValues = await showDialog<Set<int>>( context: context, builder: (BuildContext context) { return MultiSelectDialog( items: items, // 不需要传initialSelectedValues参数 ); }, );
方案2:设置默认值(适合未传参时默认使用空Set的场景)
如果不需要区分「未传参」和「主动传空Set」,直接给参数设置默认的空常量Set即可,不需要修改类型:
class MultiSelectDialog<V> extends StatefulWidget { MultiSelectDialog({ required this.items, this.initialSelectedValues = const <V>{}, }); final List<MultiSelectDialogItem<V>> items; final Set<V> initialSelectedValues; // 保持非空类型不需要修改 @override State<StatefulWidget> createState() => _MultiSelectDialogState<V>(); }
注意:默认值必须是编译时常量,所以要使用
const <V>{}声明,不能直接写{}或者<V>{}。
调用时同样可以省略该参数,无需额外判空即可直接使用。
内容的提问来源于stack exchange,提问作者La Pyae
相关产品推荐
相关产品推荐

