Dart 语言
async、集合与 FP。
Dart 语言
这一课你将能做到
- 用 Dart 写变量、函数、类,理解
final/const/var/late的区别 - 熟练使用 List、Map、Set 以及函数式操作(map / where / fold)
- 写出正确的异步代码:Future、async/await、Stream,并理解空安全(
?/!/??)
为什么要学
Flutter 的 UI 全部由 Dart 写,Dart 不熟,写 Widget 就是抄。Dart 和 Java/Kotlin 很像,但有三个对 Flutter 至关重要的特性:空安全(编译期拦截 NPE)、async/await(IO 不卡 UI)、级联与函数式 API(写 UI 表达力强)。
人话:Dart 就是给 Flutter 量身定做的「安全版 JavaScript + 简化版 Java」。
先建立图像
强类型 var / final / const / late
面向对象 class / mixin / extension / interface
函数式 高阶函数 / map / where / 级联 ..
异步 Future + async/await + Stream
空安全 String vs String? 编译期强制区分
跟着做
不想装环境?打开 <https://dartpad.dev> 把每段代码粘进去点 Run。
步骤 1:变量与类型
void main() {
var name = 'Ada'; // 类型推断为 String
final now = DateTime.now(); // 运行期一次赋值,不可改
const pi = 3.14159; // 编译期常量
late String token; // 延迟初始化,使用前必须赋值
int age = 18;
double height = 1.72;
bool isAdmin = false;
print('$name $age $height $isAdmin $pi');
token = 'abc';
print(token);
}
要点:var 类型一旦确定不可变;final 是「运行期只读」;const 是「编译期常量」,能 const 就 const,Flutter 中性能更好。
步骤 2:函数
// 普通函数
int add(int a, int b) => a + b;
// 可选命名参数(Flutter 里到处是这种写法)
void greet({required String name, int age = 0}) {
print('hello $name, $age');
}
// 函数作为参数
void repeat(int times, void Function(int) action) {
for (var i = 0; i < times; i++) action(i);
}
void main() {
print(add(2, 3));
greet(name: 'Bob'); // age 用默认值
repeat(3, (i) => print('第 $i 次'));
}
步骤 3:集合与函数式
void main() {
var nums = [1, 2, 3, 4, 5];
var evens = nums.where((n) => n.isEven).map((n) => n * 10).toList();
print(evens); // [20, 40]
var sum = nums.fold(0, (a, b) => a + b);
print(sum); // 15
var user = {'name': 'Ada', 'age': 18};
print(user['name']);
var tags = <String>{'a', 'b', 'a'}; // Set 自动去重
print(tags); // {a, b}
// 集合里写控制流(Flutter 写 UI 巨好用)
var list = [
'start',
if (user['age'] == 18) '成年',
for (var i = 0; i < 3; i++) '项$i',
...nums.map((e) => 'n$e'),
];
print(list);
}