Logo
Section 1 / 11

扩展方法

学习如何使用扩展方法来扩展核心类或第三方类的功能。

导入

扩展方法

学习如何使用扩展方法来扩展核心类或第三方类的功能。

简介

Dart 扩展功能最初在 Dart 2.6 中以预览形式推出,现已正式发布于 Dart 2.7。扩展功能允许为现有库添加新功能。

有时你可能希望在第三方库或核心类(如 String)中添加便捷的方法。然而,并非总是能够直接向这些类中添加自定义方法。

一种可行的解决方案是编写包含 static 方法和成员的工具类或包装类。但这种方法的缺点是会增加代码量,导致代码库膨胀并引入更多对象。

在这种情况下,扩展功能非常有用。虽然它看起来像包装类,但实际上有所不同:在包装类中,对象需要显式作为参数传递给静态方法;而扩展则隐式地扩展了类型。

定义扩展

在 Dart 中,扩展通过一个代码块来定义。该代码块以 extension 开始,后接可选的扩展名称、on 关键字以及目标数据类型。

让我们为 List 类型添加自定义功能。我们可以使用泛型类型 T 来支持多种数据类型。

如果你对泛型不熟悉也无需担心。我们将在课程后续部分详细讲解泛型。

定义扩展代码块有两种方式:

1// 方式一 2extension<T> on List<T> {} 3 4// 方式二 5extension<T> MyList on List<T> {}

方式一适用于扩展与使用它的代码位于同一文件时。方式二则提供了扩展名称 MyList,命名是可选的。当扩展定义在独立文件或库中,或者需要被导入到其他 Dart 文件时,推荐使用方式二。

扩展类型

Dart 支持三种类型的扩展实现:

  • 扩展方法
  • 扩展操作符
  • 扩展属性
1extension<T> on List<T> { 2 // 扩展方法 3 4 // 扩展操作符 5 6 // 扩展属性 7}

本节课我们将重点学习扩展方法。

扩展方法

本节将为 List 类型添加两个扩展方法。我们将使用一组价格列表作为示例。第一个例子展示如何编写一个简单的扩展方法;第二个例子则演示如何利用扩展方法修改列表中的元素。

示例 #1

在此示例中,你将学习如何为 List 类型编写扩展方法。扩展方法 priceList() 返回原始价格列表,不作任何修改。该方法展示了如何通过 this 隐式扩展类型。

1// 本地扩展方法 2extension<T> on List<T> { 3 // 扩展方法演示 4 List<T> priceList() => this.map((item) => item).toList(); 5} 6 7void main() { 8 // 价格列表 9 List prices = [1, 1.99, 4]; 10 11 print("价格列表:"); 12 13 // 在 prices 列表上调用 priceList() 14 // 返回原始价格列表 15 print(prices.priceList()); 16}

示例 #2

在此示例中,你将学习如何使用扩展方法来修改列表中的元素。假设你需要为每个价格项添加美元符号 $。由于这一功能仅适用于当前场景,将其加入核心 List 类可能并不合适。这正是 Dart 扩展功能发挥作用的典型场景。你可以通过扩展方法让核心类“看起来”具备该功能。

扩展方法 priceLabels(String symbol) 遍历价格列表,并为每个价格项添加指定的符号前缀。

运行以下代码片段,查看 priceLabels(...) 扩展方法的实际效果。

1extension<T> on List<T> { 2 // 扩展方法:添加 $ 前缀 3 List<String> priceLabels(String symbol) => 4 this.map((item) => "$symbol${item}").toList(); 5} 6 7// 使用 priceLabels() 方法,并传入 '$' 符号 8// 作为列表中各项的前缀 9void main() { 10 // 价格列表 11 List prices = [1, 1.99, 4]; 12 13 print("\n带 \$ 前缀的价格列表"); 14 15 // 传入 $ 符号 16 print(prices.priceLabels("\$")); 17}

简介

挑战:扩展方法