Flutter.Dart的主构造函数(primary constructor)可能马上就要来了

Dart 语言团队正在添加对主构造函数(primary constructors)的支持。这一功能很可能会随 Dart 3.13 一起发布。

这个特性并不稀奇,很多种主流语言都支持,而Dart也即将迎来它的主构造函数。

对于 Flutter 开发者来说,这意味着更简洁的 widget、更简洁的 model、更简洁的一切。

什么是主构造函数?

如果你了解过Kotlin、Swift、C#等开发语言,那你一定比较熟悉主构造函数(primary constructor),即使你可能没听说过这个词,但一看到你就瞬间明白了,比如:

Kotlin

kotlin 复制代码
class User(  
   val name: String,  
   val age: Int  
)

C#

C# 复制代码
class User(string name, int age)

另外,Scala 也支持主构造函数。Swift 虽然在文档中没有使用 "primary" 这个词,但它采用了类似的语法。

回到问题:"什么是主构造函数?"

主构造函数(primary constructor)是直接声明在类定义本身的构造函数。

我们不再将字段和构造函数参数分开声明,而是直接在类头部将它们一起定义。

我们以前写一个Dart的类是这样式的:

dart 复制代码
class User {
  final String name;
  final int age;
  final bool isAdmin;

const User({
    required this.name,
    required this.age,
    required this.isAdmin,
  });
}

同样的类换用主构造函数来实现则变成了:

dart 复制代码
class const User({
  required final String name,
  required final int age,
  required final bool isAdmin,
});

构造函数参数会自动成为字段。

无需重复声明。

无需额外的构造函数代码块。

代码简洁度翻倍。

很显然,Dart对主构造函数的支持实在是有点太晚了,正如上面提到的,很多语言其实是有类似的特性,但怎么说呢?好饭还是有点怕晚,哈哈哈哈......

当然了,对于这种可以提升开发效率的特性,我是特别期待的,甚至在我看来主构造函数甚至是一个必备特性,但它也带来了一个小小的可读性问题。

以下是一个没有使用主构造函数的 Flutter widget 定义:

dart 复制代码
class ProductCard extends StatelessWidget {
  final String title;
  final String subtitle;
  final double price;
  final String imageUrl;
  final VoidCallback onTap;
  final bool isFavorite;
  final bool showDiscount;
  final Color backgroundColor;
  final EdgeInsets padding;
  final TextStyle? titleStyle;
  
  const ProductCard({
    super.key,
    required this.title,
    required this.subtitle,
    required this.price,
    required this.imageUrl,
    required this.onTap,
    required this.isFavorite,
    required this.showDiscount,
    required this.backgroundColor,
    required this.padding,
    this.titleStyle,
  });
  @override
  Widget build(BuildContext context) {
    ...
  }
}

代码虽然冗长,但我们一眼就能看出 ProductCard 继承自 StatelessWidget。

现在是用主构造函数重写的同一个 widget。

dart 复制代码
class ProductCard({
  super.key,
  required final String title,
  required final String subtitle,
  required final double price,
  required final String imageUrl,
  required final VoidCallback onTap,
  required final bool isFavorite,
  required final bool showDiscount,
  required final Color backgroundColor,
  required final EdgeInsets padding,
  final TextStyle? titleStyle,
}) extends StatelessWidget {

@override
  Widget build(BuildContext context) {
   ...
  }
}

代码简洁度确实提升了,但我们需要往下看才能找到它的父类。当然也可能只是习惯问题吧。

我认为在不久的将来,主构造函数将成为 Flutter 代码的主流写法。

你觉得呢?

你觉得dart还有哪些地方值得提升?

相关推荐
霸道流氓气质4 小时前
Graph Studio Web IDE 深度实战:可视化编排、断点调试与生产级运维全指南
运维·前端·ide
福兮说12 小时前
前端下载大文件,点了按钮半天没反应:fetch + blob 的三个问题和三种替代写法
前端·javascript·性能优化·文件下载
GreenTea12 小时前
我把 Agent 的 while 循环拆掉了:一种你可能没想到的 Agent 架构
前端·后端·架构
科技观察哨12 小时前
六足平台选型与纳米定位系统集成:HEB-640六自由度位移台在半导体光刻对准中的参数边界与国产替代评估
前端·人工智能
niucloud-admin13 小时前
JAVA V6 多商户商城 开发文档——web前端
前端
颜进强13 小时前
16 · NestJS LifecycleEvents 生命周期事件:五个钩子、三条边界,和 rag-server 的优雅停机
前端·后端·ai编程
今年下半年14 小时前
【VUE】整合腾讯地图、自定义区域边界、村委名称及资产统计(放大显示资产点位)
前端·javascript·vue.js
郑州光合科技余经理14 小时前
同城电商系统:库存变更怎么同步到订单
java·开发语言·前端·后端·uni-app·php·ai编程
前端snow16 小时前
ai agent --- DeepAgents 中间件
前端
data analyse 45617 小时前
报表能自定义的国内统计工具有哪些
前端·数据分析