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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:15:03