zl程序教程

您现在的位置是:首页 >  Java

当前栏目

什么是Dart构造函数拆分

2023-02-18 16:38:06 时间

一.背景

最近看rollbar_flutter | Flutter Package源码发现有类似Class.new写法,查了下相关用法,总结下构造函数拆分的知识点。

二. 实例代码

class User {
  User();
  final String name = "MisterX";
  final String email = "misterx@gmail.com";
}

void main() {
  //-----------
  //这里User.new不是很明白
  //-----------
  const x = User.new;
  final z = x();
  print(z.email);
}

三. 函数拆分

可以使用函数名称创建一个函数对象,该对象指向另外一个对象的函数。如下示例中

  1. m.greet函数创建了一个函数对象g;
  2. g指向了另外一个函数forEach的入参函数。
class Greeter {
  final String name;
  Greeter(this.name);

  void greet(String who) {
    print('$name says: Hello $who!');
  }
}

void main() {
  final m = Greeter('Michael');
  final g = m.greet;
  g('Leaf');

  print('========1=========');
  ['Lasse', 'Bob', 'Erik'].forEach(m.greet);

}

四. 构造函数拆分(也称为构造函数指针)

.new is a way to pass a reference to the constructor. It doesn't create a new class. It's just the same default constructor of the class. This is also called a constructor tear-off. It was introduced in Dart 2.15.

解读:

  1. .new是类的方法,不是对象方法。
  2. 不会创建新类。
  3. 返回值是类的构造函数, 注意是函数。
  4. Dart2.15 引入。

五. 应用

1. Flutter中简洁快速构建控件

class FruitWidget extends StatelessWidget {
  const FruitWidget({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Column(
        crossAxisAlignment: CrossAxisAlignment.center,
        mainAxisAlignment: MainAxisAlignment.center,
        children: ['Apple', 'Orange'].map(Text.new).toList());
  }
}

2. 减少没必要的静态工厂方法


六.参考链接

  1. flutter - What does Class.new do in Dart - Stack Overflow
  2. Announcing Dart 2.15. Fast concurrency, constructor… | by Michael Thomsen | Dart | Medium
  3. https://github.com/rollbar/rollbar-flutter