在Dart中,假设我有以下类class MyClass { const MyClass(); }如果我有一个接受Widget Function() someProperty的类的属性,我习惯于说someProperty: () => const MyClass(),但我想知道,如果我说someProperty: MyClass.new,MyClass会使用它的const构造函数调用吗?还是总是使用它的默认(非const)构造函数调用?
class MyClass { const MyClass(); }
Widget Function() someProperty
someProperty: () => const MyClass()
someProperty: MyClass.new
iaqfqrcu1#
撕裂将始终构造非const对象。当您创建tear-off时,没有办法知道稍后是否会使用const或非const参数调用它。也没有办法指定tear-off应该被限制为只能用const参数调用。由于tear-off是一个Function对象,并且是可变的,所以没有办法知道它是否是const构造函数的tear-off,并且可以在const上下文中调用,所以在调用tear-off时也不能指定const。你可以利用规范化的const对象(通常)来自己测试:
const
Function
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 }
czq61nw12#
如果使用someProperty: () => const MyClass(),它将调用MyClass的const构造函数。但是,如果使用someProperty:MyClass.new,它将调用MyClass的默认(非常量)构造函数。const关键字创建不可变的对象,并且可以在编译时计算。当您使用const MyClass()时,您将调用MyClass的const构造函数,它将创建该类的编译时常量示例。使用MyClass.new调用MyClass的默认构造函数,该构造函数创建类的常规示例。此示例不作为编译时常量计算,并且可以是可变的。总结:如果你想确保MyClass的const构造函数被调用,你需要显式地使用someProperty: () => const MyClass()。一些代码片段:
MyClass
MyClass.new
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, ), )); }
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/
MyClass()
3条答案
按热度按时间iaqfqrcu1#
撕裂将始终构造非
const
对象。当您创建tear-off时,没有办法知道稍后是否会使用const
或非const
参数调用它。也没有办法指定tear-off应该被限制为只能用const
参数调用。由于tear-off是一个Function
对象,并且是可变的,所以没有办法知道它是否是const
构造函数的tear-off,并且可以在const
上下文中调用,所以在调用tear-off时也不能指定const
。你可以利用规范化的
const
对象(通常)来自己测试:czq61nw12#
如果使用
someProperty: () => const MyClass()
,它将调用MyClass
的const构造函数。但是,如果使用someProperty:MyClass.new
,它将调用MyClass
的默认(非常量)构造函数。const关键字创建不可变的对象,并且可以在编译时计算。当您使用
const MyClass()
时,您将调用MyClass
的const构造函数,它将创建该类的编译时常量示例。使用
MyClass.new
调用MyClass
的默认构造函数,该构造函数创建类的常规示例。此示例不作为编译时常量计算,并且可以是可变的。总结:如果你想确保MyClass的const构造函数被调用,你需要显式地使用
someProperty: () => const MyClass()
。一些代码片段:
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/