我在DART认识function typedefs已经很久了.它们在this question的答案中也有解释.
现在,我听说大约有non-function type aliases个(或非函数的typedeff)加入DART.
我想知道两件事:
- DART中的(非函数)typedefs到底是什么?
- 我如何使用它们(在我的Flutter 翼项目中)?
我在DART认识function typedefs已经很久了.它们在this question的答案中也有解释.
现在,我听说大约有non-function type aliases个(或非函数的typedeff)加入DART.
我想知道两件事:
您可以查看完整的设计文档的feature specification for Generalized type alisases.
我想先指出Dart过go 只支持typedefs for functions.new generalized功能支持102.
typedef JsonMap = Map<String, dynamic>;
JsonMap parseJsonMap(String input) => json.decode(input) as JsonMap;
当您有多个泛型类型(类型参数)时,这尤其有用,这些泛型类型会导致冗长的类型名称,例如Map<ScaffoldFeatureController<SnackBar, SnackBarClosedReason>, SnackBar>
.现在可以使用类型别名简化此操作:
typedef ScaffoldSnackBarMap = Map<ScaffoldFeatureController<SnackBar, SnackBarClosedReason>, SnackBar>;
如果上面的示例不清楚,以下是类型alisases/typedefs的语法:
'typedef' identifier typeParameters? '=' type ';'
这意味着您始终需要以typedef
关键字开头,后跟所需的标识符,例如FooTypeDef
.之后,可以添加类型参数,例如Foo<K, V>
.最后一步是添加=
符号,后跟要为其创建别名的实际类型.可以是any type,即类、基元类型、函数类型或w/e.不要忘记末尾的;
;)
// Type parameters / generic types in typedef.
typedef Foo<K, V> = Map<K, V>;
// Type alias for regular types.
typedef Bar = Widget;
// As well as primitive types.
typedef Baz = int;
// Function types are also supported.
typedef FooFunction<T, R> = R Function(T param);
此外,您可以对any class个名称使用typedef
.假设您想将您的类从Provider
重命名为Pod
,因为您认为前者太冗长.如果您维护的是套餐,这将是breaking change.使用新的通用类型别名,您可以简单地重命名您的类并创建您不推荐使用的类型别名:
class NewClassName<T> {}
@Deprecated("Use NewClassName instead")
typedef OldClassName<T> = NewClassName<T>;
请注意,此示例和上面的示例取自该功能的proposed CHANGELOG entry.
该功能将是shipped by default和dart 2.13,但目前仍处于试验阶段.我将介绍如何以这两种方式使用它;稍后可以删除实验方法.
如前所述,该功能将从DART 2.13开始启用by default.如果您当前已经安装了DART 2.13(例如,您可以使用dart --version
进行判断),则可以使用此方法.否则,您应该参考下面的实验支持节.
在pubspec.yaml
中,需要将Dart SDK上的lower bound约束定义为大于或等于2.13.0
:
environment:
dart: '>=2.13.0 <3.0.0'
在Flatter项目(或任何其他Dart项目)中,currently需要将其启用为an experiment.这意味着它们隐藏在功能标志后面.
可以使用analysis_options.yaml
配置实验性DART功能.您只需在项目目录的根目录中创建一个analysis_options.yaml
file,然后添加以下行:
analyzer:
enable-experiment:
- nonfunction-type-aliases
现在,您还需要在run(或构建)应用程序时启用该实验:
flutter run --enable-experiment=nonfunction-type-aliases
为了确保可以使用此功能,请使用master
通道(使用Flutter 时为flutter channel master
通道).