共计 5751 个字符,预计需要花费 15 分钟才能阅读完成。
老铁记得 转发,猫哥会出现更多 Flutter 好文~~~~
微信群 ducafecat
b 站 https://space.bilibili.com/40…
原文
https://medium.com/flutterdev…
参考
- https://dart.dev/guides/langu…
注释
在这个博客中,咱们将摸索 TypeDef In Dart & Fluter。它通知你在 Dart 中应用 typedef 的最好办法。它同样工程在 Flutter 和有一个利用例子在您的 Flutter 应用程序。
在 Dart 中,您能够应用 typedef 关键字创立类型别名来应用某种类型。本文介绍了如何制作函数型和非函数型的 typedef,以及如何利用所制作的 typedef。
如何为函数应用 typedef
Typedef 关键字最后是在 Dart 1 中应用的,用来暗示函数。在 Dart 1 中,如果须要将函数用作变量、字段或边界,则须要首先应用 typedef。
要应用类型别名,只需将函数标记降级为 typedef。从那时起,您能够应用 typedef 作为变量、字段或边界,如上面的模型所示。
typedef IntOperation<int> = int Function(int a, int b);
int processTwoInts (IntOperation<int> intOperation, int a, int b) {return intOperation(a, b);
}
class MyClass {
IntOperation<int> intOperation;
MyClass(this.intOperation);
int doIntOperation(int a, int b) {return this.intOperation(a, b);
}
}
void main() {IntOperation<int> sumTwoNumbers = (int a, int b) => a + b;
print(sumTwoNumbers(2, 2));
print(processTwoInts(sumTwoNumbers, 2, 1));
MyClass myClass = MyClass(sumTwoNumbers);
print(myClass.doIntOperation(4, 4));
}
当咱们运行应用程序时,咱们应该失去屏幕的输入,就像屏幕下方的最终输入一样:
4
3
8
上面是函数具备泛型参数类型的另一个模型。
typedef Compare<T> = bool Function(T a, T b);
bool compareAsc(int a, int b) => a < b;
int compareAsc2(int a, int b) => a - b;
bool doComparison<T>(Compare<T> compare, T a, T b) {assert(compare is Compare<T>);
return compare(a, b);
}
void main() {print(compareAsc is Compare<int>);
print(compareAsc2 is Compare<int>);
doComparison(compareAsc, 1, 2);
doComparison(compareAsc2, 1, 2);
}
当咱们运行应用程序时,咱们应该失去屏幕的输入,就像屏幕下方的最终输入一样:
true
false
true
自从 Dart 2 之后,你能够在任何中央应用函数类型的标点符号。因而,再应用 typedef 并不重要。另外还示意喜爱内联函数类型。这是因为浏览代码的集体能够间接看到函数类型。上面是能够与没有 typedef 的主体模型进行比拟的内容。
int processTwoInts (int Function(int a, int b) intOperation, int a, int b) {return intOperation(a, b);
}
class MyClass {int Function(int a, int b) intOperation;
MyClass(this.intOperation);
int doIntOperation(int a, int b) {return this.intOperation(a, b);
}
}
void main() {int Function(int a, int b) sumTwoNumbers = (int a, int b) => a + b;
print(sumTwoNumbers(2, 2));
print(processTwoInts(sumTwoNumbers, 2, 1));
MyClass myClass = MyClass(sumTwoNumbers);
print(myClass.doIntOperation(4, 4));
}
尽管如此,如果函数很长而且大部分工夫被利用,那么应用 typedef 很有价值。
对 Non-Functions 应用 typedef:
在 Dart 2.13 之前,你能够应用 typedef 来处理函数类型。自从 Dart 2.13 以来,你同样能够应用 typedefs 来创立暗示非函数的类型别名。应用基本上是雷同的,你只须要容许类型作为一个 typedef。
首先,你的 Dart 表格应该是 2.13 或以上版本。为 Flutter,你须要利用版本 2.2 或以上。此外,您还须要在 pubspec 中刷新根本 SDK 表单。Yaml to 2.13.0 and run bar get (for Dart) 或 Flutter pub get (for Flutter)。
environment:
sdk: ">=2.13.0 <3.0.0"
例如,您须要形容存储整数数据列表的类型。因为这个起因,您能够创立一个 typedef,其类型是 List <int>
。之后,如果须要形容用于搁置信息显示的变量,能够应用 typedef 作为类型。在上面的模型中,咱们刻画了一个类型为 List <int>
的被认为是 DataList 的 typedef。正如您能够在上面的代码中找到的,利用 typedef 能够给您提供与利用理论类型类似的操作。您能够间接降级列表值,并拜访 List 的技术和属性。如果你查看 runtimeType,你会失去 List <int>
作为后果。
typedef DataList = List<int>;
void main() {DataList data = [50, 60];
data.add(100);
print('length: ${data.length}');
print('values: $data');
print('type: ${data.runtimeType}');
}
当咱们运行应用程序时,咱们应该失去屏幕的输入,就像屏幕下方的最终输入一样:
length: 3
values: [50,60,100]
type: List<int>
与变量不同,类型别名同样能够用作技术的字段、参数和返回值。
typedef DataList = List<int>;
class MyClass {
DataList currentData;
MyClass({required this.currentData});
set data(DataList currentData) {this.currentData = currentData;}
ScoreList getMultipliedData(int multiplyFactor) {DataList result = [];
currentData.forEach((element) {result.add(element * multiplyFactor);
});
return result;
}
}
void main() {MyClass myClass = MyClass(currentData: [50, 60, 70]);
myClass.data = [60, 70];
print(myClass.currentData);
print(myClass.getMultipliedData(3));
}
当咱们运行应用程序时,咱们应该失去屏幕的输入,就像屏幕下方的最终输入一样:
[70, 90]
[180, 210]
上面是另一种模式。例如,您须要一个用于存储申请注释的类型,该类型的键和值类型对于每种类型都可能不同。对于这种状况,Map <String,dynamic> data type
是正当的。尽管如此,每次您须要申明一个申请主体变量时,您能够为该类型创立 typedef,而不是应用 Map <String,dynamic>
。
typedef RequestBody = Map<String, dynamic>;
void main() {
final RequestBody requestBody1 = {
'type': 'BUY',
'itemId': 2,
'amount': 200,
};
final RequestBody requestBody2 = {
'type': 'CANCEL_BUY',
'orderId': '04567835',
};
print(requestBody1);
print(requestBody2);
}
当咱们运行应用程序时,咱们应该失去屏幕的输入,就像屏幕下方的最终输入一样:
{type: BUY, itemId: 2, amount: 200}
{type: CANCEL_BUY, orderId: 04567835}
还能够定义具备泛型类型参数的类型别名。上面的 ValueList 类型别名有一个泛型类型参数 t。应用类型别名定义变量时,能够传递要应用的泛型类型。
相似地,您能够示意具备泛型类型参数的类型别名。上面的 NumberList 类型别名具备一个非独占类型参数 t。在利用类型别名对变量进行特色化时,能够传递惯例类型以进行利用。
typedef NumberList<T> = List<T>;
void main() {NumberList<String> numbers = ['1', '2', '3'];
numbers.add('4');
print('length: ${numbers.length}');
print('numbers: $numbers');
print('type: ${numbers.runtimeType}');
}
当咱们运行应用程序时,咱们应该失去屏幕的输入,就像屏幕下方的最终输入一样:
length: 4
numbers: [1, 2, 3, 4]
type: List<String>
Usage in Flutter
上面的代码是一个 Flutter 模型,它为 List <widget>
类型定义了 typedef。
import 'package:flutter/material.dart';
typedef WidgetList = List<Widget>;
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
home: TypedefExample(),
debugShowCheckedModeBanner: false,
);
}
}
class TypedefExample extends StatelessWidget {WidgetList buildMethod() {
return <Widget>[const FlutterLogo(size: 60),
const Text('FlutterDevs.com', style: const TextStyle(color: Colors.blue, fontSize: 24)),
];
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Flutter Demo'),
),
body: SizedBox(
width: double.infinity,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: buildMethod(),),
),
);
}
}
Conclusion
在这篇文章中,我解释了在 Dart & Fluter 中 TypeDef 的根本构造,您能够依据本人的抉择批改这个代码。这是一个小型介绍 TypeDef 在 Dart 和 Fluter 对用户交互从我这边,它的工作应用 Flutter。
我心愿这个博客可能为你提供足够的信息,帮忙你在你的我的项目中尝试应用 TypeDef In Dart & Fluter。这就是如何制作和利用 Dart/Flutter 中的 typedef。您须要容许 typedef 的类型或函数签名。而后,在这一点上,能够将所生成的 typedef 用作策略的变量、字段、参数或返回值。所以请尝试一下。
© 猫哥
https://ducafecat.tech/
https://github.com/ducafecat
往期
开源
GetX Quick Start
https://github.com/ducafecat/…
新闻客户端
https://github.com/ducafecat/…
strapi 手册译文
https://getstrapi.cn
微信探讨群 ducafecat
系列汇合
译文
https://ducafecat.tech/catego…
开源我的项目
https://ducafecat.tech/catego…
Dart 编程语言根底
https://space.bilibili.com/40…
Flutter 零根底入门
https://space.bilibili.com/40…
Flutter 实战从零开始 新闻客户端
https://space.bilibili.com/40…
Flutter 组件开发
https://space.bilibili.com/40…
Flutter Bloc
https://space.bilibili.com/40…
Flutter Getx4
https://space.bilibili.com/40…
Docker Yapi
https://space.bilibili.com/40…