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

Dart构造函数@required注解报错及参数格式疑问

问题原因解析

咱们一步步拆解你遇到的问题,核心是Dart里参数类型和**@required注解的适用规则**不匹配导致的:

1. @required注解的使用限制

Dart的@required注解(现在Dart 2.12+更推荐用required关键字)有明确的使用规则:它只能标注在无默认值的命名参数上。

你最初的构造函数定义的是位置参数(没有用{}包裹):

const Category( @required this.name, @required this.icon, @required this.color ) : assert(name != null), assert(icon != null), assert(color != null);

位置参数本身就要求调用者必须按顺序传入,不需要@required来标记“必填”——Dart直接不允许在位置参数上用这个注解,所以你会看到第一个报错:The type parameter icon is annotated with @required but only named parameters without default value can be annotated with it.

2. 位置参数 vs 命名参数的调用语法不匹配

你调用构造函数时用了命名参数语法(name: ...):

Category(name: _categoryName, icon: _categoryIcon, color: _categoryColor),

但你的构造函数定义的是位置参数,调用位置参数必须按顺序传值,不能用参数名: 值的语法,这就导致了第二个调用报错。

3. 加{}后解决问题的原因

当你把构造函数参数用{}包裹后,参数就变成了命名参数:

const Category({ @required this.name, @required this.icon, @required this.color }) : assert(name != null), assert(icon != null), assert(color != null);

这时候:

  • 命名参数允许用@required标注(因为它们默认是可选的,需要用@required强制调用者传入),符合语法规则,第一个报错消失;
  • 调用时用参数名: 值的命名参数语法完全匹配构造函数的定义,第二个报错也自然消失了。

另外补充个小知识点:现在Dart的新版本里,@required注解已经被required关键字替代,写法变成这样:

const Category({ required this.name, required this.icon, required this.color }) : assert(name != null), assert(icon != null), assert(color != null);

功能是一样的,只是语法更简洁规范~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:59:42