Menu
CoddyTech

Dart 速查表

最后更新

Hello World 与程序结构

每个 Dart 程序都从顶层的 main 函数开始。

操作语法
入口点void main() { ... }
输出一行print("Hello, World!");
字符串插值print("Hi $name");
在插值中使用表达式print("Sum: ${a + b}");
注释// this is a comment
多行注释/* ... */
导入库import 'dart:math';
运行文件dart run main.dart

变量与类型

Dart 是静态类型语言,但可以用 var 推断类型。

操作语法
类型推断的变量var age = 30;
显式类型int age = 30;
编译期常量const pi = 3.14;
运行期常量final name = getName();
基本类型int, double, String, bool
动态类型dynamic x = 5;
类型转换int.parse("42"), n.toString()
检查类型x is String, x as String

空安全

类型默认不可为空;加上 ? 才允许为 null。

操作语法
不可空(默认)int count = 0;
可空类型String? name;
空感知访问user?.name
空合并name ?? "default"
空合并赋值name ??= "default";
断言非空name!
延迟初始化late String value;
空感知展开[...?maybeList]

字符串

字符串可以用单引号、双引号和三引号。

操作语法
长度s.length
转大写 / 小写s.toUpperCase(), s.toLowerCase()
插值"Total: $price"
拼接"foo" + "bar"
是否包含s.contains("ell")
以某内容开头 / 结尾s.startsWith("he")
分割"a,b,c".split(",")
替换s.replaceAll("a", "b")
截取子串s.substring(0, 3)
去除首尾空白s.trim()

集合(List、Map、Set)

三种核心集合类型,都有字面量写法。

操作语法
List 字面量var nums = [1, 2, 3];
向列表添加元素nums.add(4);
访问 / 长度nums[0], nums.length
Map / wherenums.map((n) => n * 2), nums.where((n) => n > 1)
Map 字面量var ages = {"Ada": 30};
访问 Mapages["Ada"]
Set 字面量var ids = {1, 2, 3};
展开运算符var all = [...a, ...b];
集合中的 if / for[if (show) 1, for (n in xs) n]

流程控制

条件写在圆括号里;switch 支持模式匹配。

操作语法
If / elseif (x > 0) { ... } else { ... }
三元运算符var r = x > 0 ? "pos" : "neg";
Switchswitch (n) { case 1: ...; default: ... }
for 循环for (var i = 0; i < 10; i++) { ... }
for-in 循环for (var item in items) { ... }
forEachitems.forEach((x) => print(x));
while 循环while (x < 100) { ... }
Do-whiledo { ... } while (x < 100);
Break / continuebreak;, continue;

函数

函数是一等公民;箭头语法可以简写只有一个表达式的函数。

操作语法
定义函数int add(int a, int b) { return a + b; }
箭头函数int square(int x) => x * x;
可选位置参数void log(String m, [int? code]) { ... }
命名参数void box({int w = 0, int h = 0}) { ... }
必填命名参数void box({required int w}) { ... }
匿名函数var f = (x) => x * 2;
作为参数传递nums.map((n) => n * 2)
Typedeftypedef IntOp = int Function(int);

类与构造函数

类保存状态和行为;构造函数有好几种写法。

操作语法
定义类class Point { int x; int y; }
构造函数Point(this.x, this.y);
命名构造函数Point.origin() : x = 0, y = 0;
创建实例var p = Point(1, 2);
方法double dist() { ... }
Getterint get area => w * h;
继承class Circle extends Shape { ... }
调用父类构造函数super(args)
抽象类abstract class Shape { ... }
实现接口class Dog implements Animal { ... }

异步(Future / async-await)

Future 表示稍后才能拿到的值;await 会暂停执行,直到它完成。

操作语法
异步函数Future<int> load() async { ... }
等待 Futurevar data = await load();
返回值在 async 函数中写 return 42;
延迟await Future.delayed(Duration(seconds: 1));
处理错误try { await load(); } catch (e) { ... }
用 then 链式调用load().then((v) => print(v));
并行运行await Future.wait([a(), b()]);
异步 Streamawait for (var x in stream) { ... }

最常用的 Dart 语法,全都在这一页。这份 Dart 速查表是核心语言的快速参考:变量和类型、空安全、字符串、集合、流程控制、函数、类,以及编写 Flutter 应用时用到的 Future 和 async/await。

这里的内容都是标准 Dart,可以在官方 SDK 上运行。需要什么就复制什么,也可以在 Dart 在线编辑器里直接运行每个代码片段,无需安装。

Dart 速查表常见问题

这份 Dart 速查表免费吗?

免费。这份 Dart 速查表完全免费,无需注册。把它加入书签,需要查空安全运算符、集合方法或异步写法时随时回来看。

Dart 的空安全是怎么工作的?
在 Dart 中,所有类型默认都不可为空,int count 永远不能是 null。要允许 null,就加一个 ?(String? name),编译器会强制你处理为空的情况。几个运算符让这件事很简洁:?. 用于空感知访问,?? 提供备用值,! 在你确定值不为空时断言它非空。这样,空值错误会在编译时被发现,而不是等到运行时。
Future 是什么?async 和 await 是怎么工作的?
Future 表示一个稍后才能拿到的值,比如网络请求的结果。把函数标记为 async 后就能使用 await,它会暂停执行,直到 Future 完成再把值交给你。这样写出来的异步代码可以像同步代码一样从上往下读。用 try/catch 包住 await 来处理错误。
可以在线练习 Dart 吗?

可以。打开 Dart 在线编辑器,就能在浏览器里运行这份速查表中的任意代码片段,无需安装 SDK。想系统地学,Coddy 免费的交互式 Dart 课程会带你一步步从空安全和集合学到类和 async/await。

这份速查表适合初学者吗?

适合。内容从最常用的主题(变量、空安全、流程控制)排到进阶主题(类、Future、async/await),第一天就能用上前面的部分,再慢慢掌握其余内容。

Coddy 编程语言插图

在 Coddy 学习 Dart

开始