我在DART认识function typedefs已经很久了.它们在this question的答案中也有解释.

现在,我听说大约有non-function type aliases个(或非函数的typedeff)加入DART.


我想知道两件事:

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

推荐答案

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 defaultdart 2.13,但目前仍处于试验阶段.我将介绍如何以这两种方式使用它;稍后可以删除实验方法.

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通道).

Dart相关问答推荐

Dart 包版本如何工作以及我应该如何对我的 Flutter 插件进行版本控制?

如何在flutter中使用rootBundle加载图片?

结合freezed和hive

Dart/Flutter判断值是否为整数

如何通过 foreach 函数避免在 dart Map 中使用 await 键

不要将 PageView 居中 - Flutter

如何在Flutter应用程序中使用套接字?

如何在dart中的多个文件中编写多个单元测试?

Flutter列表视图底部溢出

Flutter判断变量是否为 NaN

如何突出显示所选卡片的边框?

Dart 有小部件库吗?

带有 Dart 的 CORS,我如何让它工作?

在 Dart 中切换失败

错误:default constructor is already defined

Dart 中的抽象基类

Dart:将map转换为查询字符串

Dart 中 == 和 === 有什么区别?

如何在 Dart 中逐个字符地迭代字符串?

GWT 与 Dart - 主要区别是什么? Dart 是 GWT 的潜在替代品吗?