Dart/Flutter构造函数命名参数传值失败问题求解
报错原因
Dart 空安全模式下,用大括号{}包裹的命名参数默认是可选参数,满足以下任意一种条件才符合语法要求:
- 参数被
required关键字标记,调用时必须传值 - 对应类属性设置了默认初始值
- 对应类属性声明为可空类型(类型后加
?)
你之前写的位置参数形式默认就是必填参数,空安全下不需要额外标记就能通过编译,这也是两种参数形式的核心差异。改成命名参数后代码有三个直接触发报错的问题:
- 四个属性
name/age/gender/isEng都是非空类型,命名参数既没加required标记,也没设默认值、没改可空类型,属性存在未初始化风险,编译不通过。 - 调用构造函数时漏传了
name参数,即使参数配置正确,缺必填参数也会报错。 - 继承
StatelessWidget的子类构造函数,需要在命名参数中预留super.key参数,适配Flutter框架的Key传递规范,同时Widget类的属性推荐加final修饰,符合Widget不可变的设计约束。

正确代码实现
SecondMan.dart 类定义
import 'package:flutter/material.dart'; class SecondMan extends StatelessWidget{ final String name; final int age; final String gender; final bool isEng; const SecondMan({ super.key, required this.isEng, required this.name, required this.age, required this.gender, }); @override Widget build(BuildContext context) { // 替换成你自己的页面布局逻辑 return const Placeholder(); } }
main.dart 路由调用代码
MaterialPageRoute( builder: (context) => SecondMan( name: "jame", // 补全之前遗漏的name参数 age: 24, gender: "male", isEng: true ) ),
可选配置说明
- 如果某参数不需要强制传递,可以去掉
required标记,要么给对应属性设置默认值,比如bool isEng = false;,要么把属性改成可空类型,比如bool? isEng;。 - 构造函数加
const修饰后,传入常量参数时Flutter会自动复用组件实例,减少不必要的重绘,性能更好。
内容的提问来源于stack exchange,提问作者guricoder
相关产品推荐
相关产品推荐

