ZetCode

Dart 扩展方法

最后修改日期:2025 年 1 月 15 日

在本文中,我们将介绍如何在 Dart 语言中使用扩展方法。扩展方法允许您在不修改现有类的源代码或创建子类的情况下为其添加功能。

当您想为外部库或内置类型(如 StringintList)的类添加实用方法时,扩展方法特别有用。

Dart 扩展方法简单示例

以下示例演示了如何在 Dart 中创建和使用简单的扩展方法。

main.dart
extension StringExtensions on String {
  bool get isPalindrome {
    return this == this.split('').reversed.join('');
  }
}

void main() {
  final word = 'racecar';
  print('Is "$word" a palindrome? ${word.isPalindrome}');
}

在此程序中,我们为 String 类定义了一个扩展方法 isPalindrome。该方法检查一个字符串是否从前向后读都一样。

extension StringExtensions on String {
  bool get isPalindrome {
    return this == this.split('').reversed.join('');
  }
}

我们定义了一个名为 StringExtensions 的扩展,它向 String 类添加了一个 isPalindrome getter。

void main() {
  final word = 'racecar';
  print('Is "$word" a palindrome? ${word.isPalindrome}');
}

我们使用 isPalindrome 扩展方法来检查字符串 'racecar' 是否是回文。

$ dart main.dart
Is "racecar" a palindrome? true

带参数的 Dart 扩展方法

扩展方法还可以接受参数,从而允许您添加更灵活的功能。

main.dart
extension NumberExtensions on int {
  int power(int exponent) {
    return this ^ exponent;
  }
}

void main() {
  final number = 2;
  print('$number raised to the power of 3 is ${number.power(3)}');
}

在此程序中,我们为 int 类定义了一个扩展方法 power。该方法计算一个数字的幂。

extension NumberExtensions on int {
  int power(int exponent) {
    return this ^ exponent;
  }
}

我们定义了一个名为 NumberExtensions 的扩展,它向 int 类添加了一个 power 方法。

void main() {
  final number = 2;
  print('$number raised to the power of 3 is ${number.power(3)}');
}

我们使用 power 扩展方法来计算 23 次方。

$ dart main.dart
2 raised to the power of 3 is 8

带泛型类型的 Dart 扩展方法

扩展方法也可以为泛型类型定义,使其可跨不同数据类型重用。

main.dart
extension ListExtensions<T> on List<T> {
  List<T> duplicate() {
    return [...this, ...this];
  }
}

void main() {
  final numbers = [1, 2, 3];
  print('Duplicated list: ${numbers.duplicate()}');
}

在此程序中,我们为 List 类定义了一个扩展方法 duplicate。该方法复制列表的元素。

extension ListExtensions<T> on List<T> {
  List<T> duplicate() {
    return [...this, ...this];
  }
}

我们定义了一个名为 ListExtensions 的扩展,它向 List 类添加了一个 duplicate 方法。该方法适用于任何类型 T

void main() {
  final numbers = [1, 2, 3];
  print('Duplicated list: ${numbers.duplicate()}');
}

我们使用 duplicate 扩展方法来复制整数列表的元素。

$ dart main.dart
Duplicated list: [1, 2, 3, 1, 2, 3]

带静态帮助方法的 Dart 扩展方法

扩展方法还可以包含静态帮助方法,这对于实用函数很有用。

main.dart
extension StringHelpers on String {
  static String capitalize(String input) {
    return input[0].toUpperCase() + input.substring(1);
  }
}

void main() {
  final name = 'alice';
  print('Capitalized name: ${StringHelpers.capitalize(name)}');
}

在此程序中,我们为 String 类的一个扩展中定义了一个静态帮助方法 capitalize。该方法将字符串的第一个字母大写。

extension StringHelpers on String {
  static String capitalize(String input) {
    return input[0].toUpperCase() + input.substring(1);
  }
}

我们定义了一个名为 StringHelpers 的扩展,其中包含一个静态 capitalize 方法。

void main() {
  final name = 'alice';
  print('Capitalized name: ${StringHelpers.capitalize(name)}');
}

我们使用静态 capitalize 方法将字符串 'alice' 的第一个字母大写。

$ dart main.dart
Capitalized name: Alice

来源

Dart 扩展方法 - 语言文档

在本文中,我们介绍了 Dart 扩展方法的基础知识。扩展方法是一种强大的功能,可以在不修改现有类源代码的情况下为其添加功能。

作者

我的名字是 Jan Bodnar,我是一位充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出 所有 Dart 教程