包含最重要概念、功能、方法等的 Dart 备忘单。初学者的完整快速参考
完整教程请参阅 Dart 中文社区 https://dart.cn/get-dart/
C:\> choco install dart-sdk # Windows
执行以下一次性设置
$ sudo apt-get update
$ sudo apt-get install apt-transport-https
$ wget -qO- https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo gpg --dearmor -o /usr/share/keyrings/dart.gpg
$ echo 'deb [signed-by=/usr/share/keyrings/dart.gpg arch=amd64] https://storage.googleapis.com/download.dartlang.org/linux/debian stable main' | sudo tee /etc/apt/sources.list.d/dart_stable.list
安装 Dart SDK
$ sudo apt-get update
$ sudo apt-get install dart
$ brew tap dart-lang/dart
$ brew install dart
// 导入核心库
import 'dart:math';
// 从外部包导入库
import 'package:test/test.dart';
// 导入文件
import 'path/to/my_other_file.dart';
// 指定前缀
import 'package:lib/lib.dart' as lib;
lib.Element element = lib.Element();
// 仅导入 foo
import 'package:lib1/lib1.dart' show foo;
// 不导入 foo
import 'package:lib2/lib2.dart' hide foo;
// 延迟导入,仅在需要时导入
import 'package:greetings/hello.dart' deferred as hello;
print(2 + 3); // 打印: 5
print(2 - 3); // 打印: -1
print(2 * 3); // 打印: 6
print(5 / 2); // 打印: 2.5 - 结果是 double
print(5 ~/ 2); // 打印: 2 - 结果是n int
print(5 % 2); // 打印: 1 - 余
int a = 1, b;
// 增
b = ++a; // 前增量 - 在 b 获得其值之前增加 a
b = a++; // 后增量 - 在 b 获得它的值之后增加 a
// 递
b = --a; // 前减量 - 在 b 获得它的值之前减少 a
b = a--; // 后减量 - 在 b 获得它的值之后递减 a
| 操作符 | 含义 |
|---|---|
& | 与(AND) |
| | 或(OR) |
^ | 异或(XOR) |
~expr | 一元位补码 (0 变为 1;1 变为 0) |
<< | 左移 |
>> | 右移 |
>>> | 无符号右移 |
final value = 0x22;
final bitmask = 0x0f;
// 与(AND)
assert((value & bitmask) == 0x02);
// 非与(AND NOT)
assert((value & ~bitmask) == 0x20);
// 或(OR)
assert((value | bitmask) == 0x2f);
// 异或(XOR)
assert((value ^ bitmask) == 0x2d);
assert((value << 4) == 0x220); // 左移
assert((value >> 4) == 0x02); // 右移
级联 (.., ?..) 允许您对同一对象进行一系列操作。除了访问实例成员之外,您还可以调用同一对象的实例方法。这通常可以节省您创建临时变量的步骤,并允许您编写更流畅的代码。考虑以下代码:
var paint = Paint()
..color = Colors.black
..strokeCap = StrokeCap.round
..strokeWidth = 5.0;
示例相当于以下代码:
var paint = Paint();
paint.color = Colors.black;
paint.strokeCap = StrokeCap.round;
paint.strokeWidth = 5.0;
以 ?...开头可确保不会对该空对象进行任何级联操作。
querySelector('#confirm') // 获取一个对象
?..text = 'Confirm' // 使用它的成员
..classes.add('important')
..onClick.listen((e) => {
window.alert('Confirmed!')
})
..scrollIntoView();
// 映射是关联键和值的对象
var person = Map<String, String>();
// 要初始化映射,请执行以下操作:
person['firstName'] = 'Nicola';
person['lastName'] = 'Tesla';
print(person);
// 打印: {firstName:Nicola, lastName:Tesla}
print(person['lastName']);
// 打印: Tesla
var nobleGases = {
// Key: Value
2: 'helium',
10: 'neon',
18: 'argon',
};
//extension 定义扩展名称 on 扩展类
extension StringExtension on String {
//扩展方法
String capitalize() {
if (isEmpty) {
return this;
}
// 将字符串的首字母大写
String topStr = this[0].toUpperCase();
return '${topStr}${substring(1)}';
}
}
void main(List<String> args) {
print("apple".capitalize());
// Print: Apple
print("苹果apple".capitalize());
// Print: 苹果apple
}
在不修改 String 类的前提下为其新增了 capitalize 方法
class Money {
final num amount;
Money({required this.amount});
}
// 利用扩展函数特性
extension MoneyOperatorExtension<T> on Money {
// operator 重载运算符
Money operator +(Money elements) {
Money newMoney = Money(amount: this.amount + elements.amount);
return newMoney;
}
}
void main(List<String> args) {
// 怎么样?两个类加起来了
Money appleMoney = Money(amount: 10.0);
Money cardMoney = Money(amount: 6.0);
Money allMoney = cardMoney + appleMoney;
print(allMoney.amount);
//Print: 16.0
}
// 一个人。隐式接口包含 greet()。
class Person {
// 在接口中,但仅在此库中可见。
final String _name;
// 不在接口中,因为这是一个构造函数。
Person(this._name);
// 在接口中
String greet(String who) => 'Hello, $who. I am $_name.';
}
// Person 接口的实现。
class Impostor implements Person {
String get _name => '';
String greet(String who) => 'Hi $who. Do you know who I am?';
}
String greetBob(Person person) => person.greet('Bob');
void main() {
print(greetBob(Person('Kathy')));
// 打印: Hello, Bob. I am Kathy.
print(greetBob(Impostor()));
// 打印: Hi Bob. Do you know who I am?
}
enum Color { red, green, blue }
使用枚举,像访问任何其他静态变量一样访问枚举值:
final favoriteColor = Color.blue;
if (favoriteColor == Color.blue) {
print('Your favorite color is blue!');
}
枚举中的每个值都有一个索引获取器,它返回枚举声明中值从零开始的位置。 例如,第一个值的索引为 0,第二个值的索引为 1
assert(Color.red.index == 0);
assert(Color.green.index == 1);
assert(Color.blue.index == 2);
要获取所有枚举值的列表,请使用枚举的值常量
List<Color> colors = Color.values;
assert(colors[2] == Color.blue);
您可以在 switch 语句中使用枚举,如果您没有处理枚举的所有值,您将收到警告:
var aColor = Color.blue;
switch (aColor) {
case Color.red:
print('Red as roses!');
break;
case Color.green:
print('Green as grass!');
break;
default: // 没有这个,你会看到一个警告
print(aColor); // 'Color.blue'
}
如果您需要访问枚举值的名称,例如 Color.blue 中的“blue”,请使用 .name 属性:
print(Color.blue.name); // 'blue'
声明了一个具有多个实例、实例变量、一个 getter 和一个已实现接口的增强型枚举
// 简单定义一个枚举类型
enum PlanetType { terrestrial, gas, ice }
// 定义一个行星复杂的枚举类型
enum Planet {
mercury(planetType: PlanetType.terrestrial, moons: 0, hasRings: false),
venus(planetType: PlanetType.terrestrial, moons: 0, hasRings: false),
uranus(planetType: PlanetType.ice, moons: 27, hasRings: true),
neptune(planetType: PlanetType.ice, moons: 14, hasRings: true);
// 定义一个构造函数
const Planet({required this.planetType, required this.moons, required this.hasRings});
// 声明枚举类型中的变量
final PlanetType planetType;
final int moons;
final bool hasRings;
// 实现枚举类型中的get 方法
bool get isGiant =>
planetType == PlanetType.gas || planetType == PlanetType.ice;
}
// 使用枚举类型
void main()
{
final yourPlanet = Planet.mercury;
if (!yourPlanet.isGiant) {
print('Your planet is not a "giant planet".');
}
}
Dart中类只能单继承,使用Mixin可以实现多个继承,复用多个类中代码的方法。
// 定义Mixin
mixin Piloted {
int astronauts = 1;
void describeCrew() {
print('Number of astronauts: $astronauts');
}
}
使用with关键字并在其后跟上Mixin类的名字来使用
// 使用with将Piloted混入
class PilotedCraft extends Spacecraft with Piloted {
// ···
}
支持混入多个Mixin,如果出现相同的方法后混入的Mixin会覆盖前面的
class Musician extends Performer with Musical {
// ···
}
// 混入多个Mixin
class Maestro extends Person with Musical, Aggressive, Demented {
Maestro(String maestroName) {
name = maestroName;
canConduct = true;
}
}
使用关键字on来指定哪些类可以使用该Mixin,比如有Mixin类MusicalPerformer,但是MusicalPerformer只能被Musician类使用,则可以这样定义MusicalPerformer:
class Musician {
// ...
}
// 现在MusicalPerformer 只能在 Musican及其子类中使用
mixin MusicalPerformer on Musician {
// ...
}
class SingerDancer extends Musician with MusicalPerformer {
// ...
}
定义:enum("enumeration"的缩写)是一种特殊的数据类型,可使变量成为一组预定义的常量。枚举用于定义只能从一小组可能值中选择一个的变量。通过为这些值集提供有意义的名称,枚举有助于提高代码的可读性,减少出错率。
// 定义枚举类型
enum TrafficLight {
red,
yellow,
green
}
// 根据交通灯状态打印消息的函数
void printTrafficLightMessage(TrafficLight light) {
switch (light) {
case TrafficLight.red:
print('Stop!');
break;
case TrafficLight.yellow:
print('Get ready...');
break;
case TrafficLight.green:
print('Go!');
break;
}
}
void main() {
// 枚举类型的示例用法
TrafficLight currentLight = TrafficLight.green;
// 打印当前交通灯状态的消息
printTrafficLightMessage(currentLight);
}