使用 dart extension

简介: 使用 dart extension

如何使用

dart extension 的使用场景是无法修改原类的时候,通过扩展的方式来增加原类的方法和属性。

比如

int.parse('42')
复制代码

如果 String  有 pareseInt 方法,我们可以这样写

'42'.parseInt()
复制代码

为了达到这个目标,需要写一个 Extension

extension NumberParsing on String {
  int parseInt() {
    return int.parse(this);
  }
  // ···
}
复制代码

然后就可以使用了。

// Import a library that contains an extension on String.
import 'string_apis.dart';
// ···
print('42'.padLeft(5)); // Use a String method.
print('42'.parseInt()); // Use an extension method.
复制代码

处理冲突

注意到前面加的  NumberParsing 了吗?这个是为 extension 起的名字。起名字的作用是有冲突的时候可以方便的控制显隐。比如 NumberParsing2 也定义了 parseInt 方法与 NumberParsing 的 parseInt 冲突,如果只想要  NumberParsing 的 parseInt,只需要把 NumberParsing2 隐藏就好了。

// Defines the String extension method parseInt().
import 'string_apis.dart';
// Also defines parseInt(), but hiding NumberParsing2
// hides that extension method.
import 'string_apis_2.dart' hide NumberParsing2;
// ···
// Uses the parseInt() defined in 'string_apis.dart'.
print('42'.parseInt());
复制代码

或者可以 给 NumberParsing2 经起个别名

import 'string_apis.dart';
import 'string_apis_2.dart' as rad;
print(NumberParsing('42').parseInt());
// Use the ParseNumbers extension from string_apis_3.dart.
print(rad.NumberParsing('42').parseInt());
// Only string_apis_3.dart has parseNum().
print('42'.parseNum());
复制代码

泛型 extension

可以只给 int 类型的 list 加 sum 方法,其它类型的 list 不能使用 sum。

extension  on List<int> {
  int sum() {
    return fold(0, (sum, v) => sum + v);
  }
}
复制代码
["1", "2", "3"].sum();  //Error: The method 'sum' isn't defined for the class 'List<String>'
[1,2,3].sum(); // ok, output 6
复制代码

要注意的问题

dart extension 不可以用于 dynamic 类型

dynamic d = '2';
print(d.parseInt()); // Runtime exception: NoSuchMethodError
复制代码

dart extension 权限很大,这也意味着,很可能被过度使用。所以在使用的时候一定要再三权衡,一定要可读性,可维护性优先。

目录
相关文章
|
4月前
|
Dart C语言 Windows
Dart ffi 使用问题之要生成plugin_ffi_sample_bindings_generated.dart文件该如何操作
Dart ffi 使用问题之要生成plugin_ffi_sample_bindings_generated.dart文件该如何操作
|
5月前
|
Dart 微服务
dart中使用protobuf
dart中使用protobuf
|
JSON Dart 编译器
Dart简单介绍
Dart是一种面向对象、用于构建高性能应用程序的编程语言,它具有快速开发、易于维护和可移植性等特点,因此在 Flutter 应用程序开发方面越来越受欢迎。在这篇文章中,我们将深入探讨 Dart 语言的一些技术思考。 类型系统
Dart简单介绍
|
Dart 编译器
Functions Paramaters——Dart
Dart是一个完全面向对象的语言,它的方法也是对象,对应的类型为Function。 这意味着方法也能被赋值给变量,或者当做参数传递给其他方法。
|
Dart JavaScript 前端开发
Functions——Dart
Dart是一个完全面向对象的语言,它的方法也是对象,对应的类型为Function。 这意味着方法也能被赋值给变量,或者当做参数传递给其他方法。
|
Dart JavaScript 前端开发
Numbers——Dart
Dart中的数字类型有两种,int和double。
Runes——Dart
Dart中,Runes是指UTF-32定义的Unicode字符串。 Unicode使用数字表示世界上所有的字母、数字和符号。因为Dart中的String是一系列UTF-16字节单元,而在String中想要表示32位的Unicode值,则需要特殊的语法。 一般我们使用 `\uXXXX` 这种形式表示一个Unicode码,`XXXX`表示4个十六进制值。例如,字符(♥)的Unicode字符是`\u2665`。 当十六进制数据多余或者少于4位时,将十六进制数放入到花括号中,例如,微笑表情(😆)是`\u{1f600}`。 String类中有几个属性你可以用来获取`rune`信息。
|
Dart 安全 编译器
dart 中的 dynamic
dart 中的 dynamic
103 0
|
Dart 开发工具
使用 dart tear-off
使用 dart tear-off
149 0
|
Dart
在 dart 中使用 equatable
在 dart 中使用 equatable
188 0