Dart 语法详细示例
1️⃣ 变量声明
复制代码
void main() {
// 显式类型声明
int age = 25;
double height = 1.75;
String name = 'Alice';
bool isStudent = true;
// 隐式类型 (var 或 dynamic)
var city = 'Beijing'; // 类型由赋值决定
dynamic anything = 100; // 可以更改类型
anything = 'Now a String';
print('$name, $age years old, lives in $city');
}
2️⃣ 常量
复制代码
const pi = 3.1415; // 编译时常量
final now = DateTime.now(); // 运行时常量
3️⃣ 函数
复制代码
// 普通函数
int add(int a, int b) {
return a + b;
}
// 箭头函数
int multiply(int a, int b) => a * b;
// 可选参数
void greet(String name, [String greeting = 'Hello']) {
print('$greeting, $name!');
}
// 命名参数
void showUser({required String name, int age = 0}) {
print('Name: $name, Age: $age');
}
void main() {
print(add(2, 3));
greet('Alice');
showUser(name: 'Bob', age: 25);
}
4️⃣ 控制流语句
复制代码
void main() {
int num = 10;
// if-else
if (num > 5) {
print('Big number');
} else {
print('Small number');
}
// for loop
for (int i = 0; i < 5; i++) {
print('i: $i');
}
// while loop
int count = 0;
while (count < 3) {
print('count: $count');
count++;
}
// switch
String grade = 'A';
switch (grade) {
case 'A':
print('Excellent');
break;
case 'B':
print('Good');
break;
default:
print('Try harder');
}
}
5️⃣ 集合类型 (List, Set, Map)
复制代码
void main() {
// List
List<int> numbers = [1, 2, 3, 4];
numbers.add(5);
// Set
Set<String> fruits = {'apple', 'banana'};
fruits.add('orange');
// Map
Map<String, String> user = {'name': 'Alice', 'city': 'Paris'};
user['age'] = '30';
print(numbers);
print(fruits);
print(user);
}
6️⃣ 类与对象
复制代码
class Person {
String name;
int age;
Person(this.name, this.age);
void sayHello() {
print('Hello, my name is $name');
}
}
void main() {
var p = Person('Tom', 30);
p.sayHello();
}
7️⃣ 继承与多态
复制代码
class Animal {
void makeSound() => print('Animal sound');
}
class Dog extends Animal {
@override
void makeSound() => print('Woof!');
}
void main() {
Animal a = Dog();
a.makeSound(); // Woof!
}
9️⃣ 异步编程 (Future & async/await)
复制代码
Future<String> fetchData() async {
await Future.delayed(Duration(seconds: 2)); // 模拟网络延迟
return 'Data loaded!';
}
void main() async {
print('Fetching data...');
String data = await fetchData();
print(data);
}
1️⃣0️⃣ 扩展运算符与空安全
复制代码
void main() {
List<int>? a = [1, 2, 3];
List<int> b = [0, ...?a]; // 空安全展开运算符
print(b); // [0, 1, 2, 3]
String? name;
String displayName = name ?? 'Guest'; // 空值处理
print(displayName); // Guest
}
语法特性
示例
变量声明
var
, final
, const
条件语句
if
, switch
循环
for
, while
, do-while
集合
List
, Set
, Map
类
class
, extends
函数
普通函数, 箭头函数
异常处理
try-catch-finally
异步
async
, await
, Future
空安全
?
, ??
, !
, ...?
Dart 数据结构:List、Map、Set 操作详解
1️⃣ List (列表/数组) 操作
复制代码
void main() {
// 创建
List<int> nums = [10, 20, 30];
// 查
print(nums[0]); // 取第一个元素
print(nums.length); // 获取长度
print(nums.contains(20)); // 是否包含某个元素
// 增
nums.add(40); // 尾部添加
nums.insert(1, 15); // 指定位置插入
nums.addAll([50, 60]); // 批量添加
print(nums);
// 删
nums.remove(20); // 删除指定元素
nums.removeAt(0); // 删除指定位置
nums.removeLast(); // 删除最后一个
nums.clear(); // 清空
print(nums);
// 改
nums = [1, 2, 3];
nums[0] = 100;
print(nums);
// 遍历
nums.forEach((e) => print('元素: $e'));
// map (映射)
var newNums = nums.map((e) => e * 2).toList();
print(newNums); // [200, 4, 6]
// where (过滤)
var filtered = nums.where((e) => e > 2).toList();
print(filtered); // [100, 3]
}
2️⃣ Map (键值对) 操作
复制代码
void main() {
// 创建
Map<String, int> scores = {'Tom': 90, 'Alice': 85};
// 查
print(scores['Tom']); // 取值
print(scores.containsKey('Alice')); // 是否包含 key
print(scores.containsValue(85)); // 是否包含 value
// 增
scores['Bob'] = 75; // 新增/更新
scores.addAll({'Jack': 80, 'Lucy': 95});
print(scores);
// 删
scores.remove('Tom');
print(scores);
scores.clear(); // 清空
print(scores);
// 改
scores = {'Tom': 90, 'Alice': 85};
scores['Tom'] = 100;
print(scores);
// 遍历
scores.forEach((key, value) {
print('$key: $value');
});
// map (映射)
var updated = scores.map((k, v) => MapEntry(k, v + 5));
print(updated);
}
3️⃣ Set (集合) 操作
复制代码
void main() {
// 创建
Set<String> fruits = {'apple', 'banana', 'orange'};
// 查
print(fruits.contains('apple')); // 是否包含
print(fruits.length); // 长度
// 增
fruits.add('grape');
fruits.addAll({'pear', 'mango'});
print(fruits);
// 删
fruits.remove('banana');
print(fruits);
fruits.clear();
print(fruits);
// 改 (Set 没有直接"改",可以先删再加)
fruits = {'apple', 'banana'};
if (fruits.contains('banana')) {
fruits.remove('banana');
fruits.add('watermelon');
}
print(fruits);
// 遍历
fruits.forEach((f) => print(f));
}
4️⃣ 常用操作对比速查表
操作
List
Map
Set
创建
[1,2,3]
{'a':1, 'b':2}
{'a', 'b'}
查
list[0]
map['a']
set.contains('a')
增
list.add()
/ insert()
map['c'] = 3
/ addAll()
set.add()
/ addAll()
删
remove()
/ removeAt()
remove()
/ clear()
remove()
/ clear()
改
list[i] = val
map[key] = val
(先删再加)
遍历
forEach
/ for
forEach
/ for
forEach
/ for
高阶函数
map()
, where()
, any()
map()
, forEach()
map()
, where()
数据遍历
1️⃣ 遍历 List
复制代码
void main() {
List<String> fruits = ['apple', 'banana', 'orange'];
// 1. for 循环
for (int i = 0; i < fruits.length; i++) {
print('水果: ${fruits[i]}');
}
// 2. for-in 循环 (简洁写法)
for (var fruit in fruits) {
print('水果: $fruit');
}
// 3. forEach (高阶函数)
fruits.forEach((fruit) {
print('水果: $fruit');
});
// 4. map/where (生成新集合)
var upperFruits = fruits.map((f) => f.toUpperCase()).toList();
print(upperFruits);
}
2️⃣ 遍历 Map
复制代码
void main() {
Map<String, int> scores = {'Tom': 90, 'Alice': 85, 'Bob': 78};
// 1. forEach 遍历
scores.forEach((key, value) {
print('$key 的分数是 $value');
});
// 2. for-in 遍历 keys
for (var key in scores.keys) {
print('key: $key, value: ${scores[key]}');
}
// 3. for-in 遍历 values
for (var value in scores.values) {
print('value: $value');
}
// 4. entries 遍历
for (var entry in scores.entries) {
print('${entry.key}: ${entry.value}');
}
}
3️⃣ 遍历 Set
复制代码
void main() {
Set<String> colors = {'red', 'green', 'blue'};
// 1. for-in 循环
for (var color in colors) {
print('颜色: $color');
}
// 2. forEach 高阶函数
colors.forEach((color) {
print('颜色: $color');
});
// 3. map 生成新集合
var upperColors = colors.map((c) => c.toUpperCase()).toSet();
print(upperColors);
}
4️⃣ 高阶函数遍历 (List/Set/Map 通用)
方法
说明
示例
forEach
遍历每个元素
list.forEach((e) => print(e));
map
转换每个元素 (返回新集合)
list.map((e) => e*2).toList()
where
过滤符合条件的元素 (新集合)
list.where((e) => e>5).toList()
any
是否有任意元素符合条件
list.any((e) => e>10)
every
是否所有元素都符合条件
list.every((e) => e>0)
reduce
聚合处理 (累计)
list.reduce((a, b) => a + b)
fold
自定义聚合 (带初始值)
list.fold(0, (a, b) => a + b)
结合 Flutter 界面 (ListView.builder) 的 完整遍历案例
比如我们有一个水果列表 List,在页面上展示出来:
复制代码
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
final List<String> fruits = ['苹果', '香蕉', '橙子', '葡萄', '西瓜'];
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('水果列表')),
body: ListView.builder(
itemCount: fruits.length,
itemBuilder: (context, index) {
return ListTile(
leading: Icon(Icons.local_grocery_store),
title: Text(fruits[index]),
trailing: Icon(Icons.arrow_forward),
onTap: () {
print('你点击了 ${fruits[index]}');
},
);
},
),
),
);
}
}
使用 ListView.builder 高效渲染列表。
itemCount 表示项目数量,itemBuilder 每个项目如何显示。
fruits[index] 是遍历列表数据的核心。
假设我们有一个 Map 列表,每个元素是一个对象(如水果和价格):
复制代码
final List<Map<String, dynamic>> fruits = [
{'name': '苹果', 'price': 5},
{'name': '香蕉', 'price': 3},
{'name': '橙子', 'price': 4},
];
$$页面展示:
body: ListView.builder(
itemCount: fruits.length,
itemBuilder: (context, index) {
var fruit = fruits[index];
return ListTile(
title: Text('${fruit['name']}'),
subtitle: Text('价格: ${fruit['price']} 元/斤'),
leading: Icon(Icons.shopping_cart),
);
},
)
## Dart 中 class 全面详解
## 1️⃣ 基本结构
class Person {
String name; // 属性
int age;
// 构造函数
Person(this.name, this.age);
// 方法
void sayHello() {
print('Hi, I am $name and I am $age years old.');
}
}
void main() {
var p = Person('Alice', 25);
p.sayHello();
}
* class 关键字定义类。
* 类中可以包含:属性(字段) 构造函数 方法
* 实例化类用 var p = Person(...)。
### 2️⃣ 构造函数详解
class Dog {
String name;
Dog(this.name); // 简写,等价于 Dog(String name) { this.name = name; }
}
void main() {
var dog = Dog('Buddy');
print(dog.name);
}
##### 命名构造函数
class Point {
int x, y;
Point(this.x, this.y);
Point.origin() : x = 0, y = 0; // 命名构造函数
Point.fromList(List coords)
: x = coords[0],
y = coords[1];
}
void main() {
var p1 = Point(2, 3);
var p2 = Point.origin();
var p3 = Point.fromList([5, 6]);
print('${p1.x}, ${p1.y}');
print('${p2.x}, ${p2.y}');
print('${p3.x}, ${p3.y}');
}
### 3️⃣ 继承、重写(Override)
class Animal {
void speak() {
print('Animal speaks');
}
}
class Dog extends Animal {
@override
void speak() {
print('Woof!');
}
}
void main() {
var a = Animal();
var d = Dog();
a.speak();
d.speak();
}
### 4️⃣ Getter \& Setter
class Circle {
double _radius;
Circle(this._radius);
double get area => 3.14 * _radius * _radius;
set radius(double r) {
if (r > 0) {
_radius = r;
}
}
}
void main() {
var c = Circle(5);
print(c.area);
c.radius = 10;
print(c.area);
}
### 5️⃣ 抽象类(abstract class)
abstract class Shape {
double area();
}
class Rectangle extends Shape {
double width, height;
Rectangle(this.width, this.height);
@override
double area() => width * height;
}
void main() {
var r = Rectangle(10, 5);
print(r.area());
}
### 6️⃣ 接口(interface)和多重继承(Dart 没有真正的多继承)
> Dart 中所有类都是隐式接口。
class Flyable {
void fly() => print('Flying');
}
class Swimmable {
void swim() => print('Swimming');
}
class Duck implements Flyable, Swimmable {
@override
void fly() => print('Duck is flying');
@override
void swim() => print('Duck is swimming');
}
void main() {
var d = Duck();
d.fly();
d.swim();
}
### 7️⃣ 静态成员 (static)
class MathUtils {
static double pi = 3.14159;
static double square(double x) => x * x;
}
void main() {
print(MathUtils.pi);
print(MathUtils.square(4));
}
### 8️⃣ 工厂构造函数(factory constructor)
class Logger {
static final Map _cache = {};
final String name;
factory Logger(String name) {
return _cache.putIfAbsent(name, () => Logger._internal(name));
}
Logger._internal(this.name);
void log(String msg) {
print('[$name]: $msg');
}
}
void main() {
var l1 = Logger('App');
var l2 = Logger('App');
print(identical(l1, l2)); // true
l1.log('Hello');
}
### 9️⃣ 扩展方法 (Extension)
extension StringExtension on String {
String greet() => 'Hello, $this!';
}
void main() {
print('Alice'.greet()); // Hello, Alice!
}
### 完整示例汇总
class Person {
String name;
int _age;
Person(this.name, int age) : _age = age;
void sayHello() => print('Hi, I am $name');
int get age => _age;
set age(int a) {
if (a > 0) _age = a;
}
static String species = 'Human';
static void printSpecies() => print('Species: $species');
}
void main() {
var p = Person('Tom', 30);
p.sayHello();
print('Age: ${p.age}');
p.age = 35;
print('New Age: ${p.age}');
Person.printSpecies();
}
### 结语
| 关键点 | 示例 |
|---------------|------------------------------|
| 类定义 | `class ClassName {}` |
| 构造函数 | `Class(this.a, this.b)` |
| 属性 (字段) | `String name;` |
| 方法 | `void sayHi() {}` |
| 继承 | `class Sub extends Super {}` |
| 抽象类 | `abstract class Shape {}` |
| Getter/Setter | `get`, `set` |
| 静态成员 | `static` |
| 工厂构造函数 | `factory` |
| 接口实现 | `implements` |
| 扩展方法 | `extension` |