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
相关产品推荐
相关产品推荐

