如何在 Dart 中使用类型别名/类型定义(也是非函数)?

cre*_*not 9 dart flutter

我很早就知道Dart 中的函数 typedef。他们也在这个问题的答案中进行了解释。

现在,我听说Dart 中出现了非函数类型别名(或非函数 typedef)。


我想知道两件事:

  • Dart 中的(非函数)typedef 到底是什么?
  • 我如何使用它们(在我的 Flutter 项目中)?

cre*_*not 20

Dart 中的通用类型别名/类型定义

您可以查看完整设计文档的通用类型别名特征规范

我想通过指出 Dart 过去只支持函数的typedef 来作为序言。该新的通用功能支持任何类型的typedef

typedef JsonMap = Map<String, dynamic>;

JsonMap parseJsonMap(String input) => json.decode(input) as JsonMap;
Run Code Online (Sandbox Code Playgroud)

当您有多个泛型类型(类型参数)导致键入繁琐的长类型名称时,这尤其有用,例如Map<ScaffoldFeatureController<SnackBar, SnackBarClosedReason>, SnackBar>. 现在可以使用类型别名来简化:

typedef ScaffoldSnackBarMap = Map<ScaffoldFeatureController<SnackBar, SnackBarClosedReason>, SnackBar>;
Run Code Online (Sandbox Code Playgroud)

句法

如果从上面的例子中没有清楚,这是类型别名/typedefs 的语法:

'typedef' identifier typeParameters? '=' type ';'
Run Code Online (Sandbox Code Playgroud)

这意味着您始终需要以typedef关键字开头,后跟所需的标识符,例如FooTypeDef. 之后,您可以添加类型参数,例如Foo<K, V>. 最后一步是添加=符号,后跟要为其创建别名的实际类型。这可以是任何类型,即类、原始类型、函数类型或 w/e。不要忘记;最后的;)

'typedef' identifier typeParameters? '=' type ';'
Run Code Online (Sandbox Code Playgroud)

弃用名称

此外,您可以将typedefs 用于任何类名。假设您想将类从 to 重命名ProviderPod因为您认为前者过于冗长。如果您正在维护一个包,这将是一个重大变化。使用新的通用类型别名,您可以简单地重命名您的类并创建一个您不赞成使用的类型别名:

// 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);
Run Code Online (Sandbox Code Playgroud)

请注意,此示例和上面的示例取自为该功能建议的 CHANGELOG 条目

如何使用它们

该功能将默认Dart 2.13 一起提供,但目前仍处于试验阶段。我将介绍如何以两种方式使用它;实验方法可以在以后删除。

飞镖 2.13

正如我之前提到的,该功能将从Dart 2.13 开始默认启用。如果您当前已经安装了 Dart 2.13(dart --version例如,您可以用来检查它),则可以使用此方法。否则,您应该参考下面的实验支持部分。

在您的 中pubspec.yaml,您需要将Dart SDK 约束的下限定义为大于或等于2.13.0

class NewClassName<T> {}

@Deprecated("Use NewClassName instead")
typedef OldClassName<T> = NewClassName<T>;
Run Code Online (Sandbox Code Playgroud)

实验支持

在您的 Flutter 项目(或任何其他 Dart 项目)中,您目前需要将它们作为实验启用。这意味着它们隐藏在功能标志后面。


实验性 Dart 功能可以使用analysis_options.yaml. 您可以简单地在项目目录的根目录中创建一个analysis_options.yaml文件并添加以下行:

environment:
  dart: '>=2.13.0 <3.0.0'
Run Code Online (Sandbox Code Playgroud)

现在,您还需要在运行(或构建)应用程序时启用实验:

flutter run --enable-experiment=nonfunction-type-aliases
Run Code Online (Sandbox Code Playgroud)

为确保您可以使用此功能,请使用master通道(flutter channel master使用 Flutter 时)。