为什么Flutter StatefulWidget子类需要重写默认构造函数?
Flutter 代码示例中普遍显式声明空逻辑构造函数的原因
你提到的两种写法在无额外参数、不需要const实例化的普通场景下,功能确实完全一致,Dart本身支持默认继承父类的无参构造函数,不需要显式声明即可正常传递
key参数。
大家普遍保留这个看似多余的构造函数,主要有三个原因:
- 社区统一模板规范:Flutter官方脚手架、官方文档示例、主流开源库的示例代码都统一采用显式声明构造函数的写法,属于约定俗成的代码风格,统一格式可以降低不同开发者写的代码的理解成本,所有人拿到代码都能第一时间找到构造函数的参数定义位置。
- 兼容const实例化优化:如果你希望你的Widget支持const实例化(用来减少不必要的Widget重建,提升性能),必须显式声明构造函数为
const,比如const Demo({Key? key}) : super(key: key);,如果不显式声明构造函数,Dart默认生成的构造函数不支持const修饰,无法享受性能优化。Dart 2.17版本之后还可以用更简洁的super参数简写:const Demo({super.key}); - 预留后续扩展空间:后续如果要给Widget新增自定义参数(比如标题、颜色、回调函数等),可以直接在已有构造函数的参数列表里追加即可,不需要额外补写构造函数的结构,修改成本更低,也不容易遗漏super调用的逻辑。
如果你的Widget是临时实现的简单组件,后续不会扩展也不需要const优化,完全可以省略这个构造函数,功能不会有任何影响。
内容的提问来源于stack exchange,提问作者Kernel James
相关产品推荐
相关产品推荐

