为什么Flutter可选位置参数中使用required关键字会报错?
问题原因解释
- Dart的语法规则中,
required关键字仅适用于大括号包裹的命名可选参数,不能用于方括号包裹的可选位置参数,这是报错的核心原因。 - Dart的参数分为三类,规则各不相同:
- 普通位置参数:无任何符号包裹,默认强制必传,无需加
required,类型默认非空 - 可选位置参数:用
[]包裹,默认允许不传,因此参数必须是可空类型,或者提前设置默认值,语法上不支持加required - 命名可选参数:用
{}包裹,默认允许不传,非空类型的参数要么设置默认值,要么加required强制要求调用方传参
- 普通位置参数:无任何符号包裹,默认强制必传,无需加
- 你最初的错误代码里,把非空类型的
String参数放在[]中,既没有设为可空也没有默认值,所以编译器首先提示你要处理非空校验;你按照提示加required又违反了可选位置参数不能用required的语法规则,所以依然报错。 - 改为大括号包裹的命名参数后,
required符合命名参数的语法规则,同时也满足了非空类型的传参强制要求,因此代码可以正常运行。
如果你需要保留可选位置参数的写法,可以参考以下两种合法写法:
- 设为可空类型:
TextFormField _textFormBuilder([String? label, String? hint]) { // 内部使用时处理空值即可 }
- 给参数设置默认值:
TextFormField _textFormBuilder([String label = '默认标签', String hint = '默认提示']) { // 不传参数时自动使用默认值 }
内容的提问来源于stack exchange,提问作者Solen Dogan
相关产品推荐
相关产品推荐

