flutter dart 撕裂常数构造器

3htmauhk  于 2023-05-19  发布在  Flutter
关注(0)|答案(3)|浏览(178)

在Dart中,假设我有以下类class MyClass { const MyClass(); }
如果我有一个接受Widget Function() someProperty的类的属性,我习惯于说someProperty: () => const MyClass(),但我想知道,如果我说someProperty: MyClass.new,MyClass会使用它的const构造函数调用吗?还是总是使用它的默认(非const)构造函数调用?

iaqfqrcu

iaqfqrcu1#

撕裂将始终构造非const对象。当您创建tear-off时,没有办法知道稍后是否会使用const或非const参数调用它。也没有办法指定tear-off应该被限制为只能用const参数调用。由于tear-off是一个Function对象,并且是可变的,所以没有办法知道它是否是const构造函数的tear-off,并且可以在const上下文中调用,所以在调用tear-off时也不能指定const
你可以利用规范化的const对象(通常)来自己测试:

class MyClass {
  const MyClass();
}

void main() {
  var f1 = () => const MyClass();
  var f2 = MyClass.new;

  print(identical(f1(), f1())); // Prints: true
  print(identical(f2(), f2())); // Prints: false
}
czq61nw1

czq61nw12#

如果使用someProperty: () => const MyClass(),它将调用MyClass的const构造函数。但是,如果使用someProperty:MyClass.new,它将调用MyClass的默认(非常量)构造函数。
const关键字创建不可变的对象,并且可以在编译时计算。当您使用const MyClass()时,您将调用MyClass的const构造函数,它将创建该类的编译时常量示例。
使用MyClass.new调用MyClass的默认构造函数,该构造函数创建类的常规示例。此示例不作为编译时常量计算,并且可以是可变的。
总结:如果你想确保MyClass的const构造函数被调用,你需要显式地使用someProperty: () => const MyClass()
一些代码片段:

class MyClass extends StatelessWidget {
  const MyClass();

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Text('Hello, World!'),
    );
  }
}

class SomeOtherClass {
  final Widget Function() someProperty;

  SomeOtherClass({required this.someProperty});
}

void main() {
  final instance = SomeOtherClass(
    someProperty: () => const MyClass(),
  );

  final widget = instance.someProperty();

  runApp(MaterialApp(
    home: Scaffold(
      body: widget,
    ),
  ));
}
9vw9lbht

9vw9lbht3#

MyClass类只会调用它的构造函数MyClass()。您可以添加const关键字,也可以不添加该关键字。两个构造函数都是唯一的构造函数。
在构造函数前面添加const是Dart语言的特殊功能(Pragmatics),每次调用构造函数时都不会编译。
如果你不清楚使用const关键字。我想参考一下这个教程。https://resocoder.com/2020/01/06/dart-const-tutorial-all-you-need-to-know-const-expressions-canonical-instances-and-more/

相关问题