今天来学if和循环还有函数,这个和其他语言的差不多

if条件语句

这个老熟人了,这里不过多描述了

1
2
3
4
5
6
7
8
9
int score = 85;

if (score >= 90) {
print("优秀");
} else if (score >= 60) {
print("及格");
} else {
print("不及格");
}

三元运算符

这个和其他语言的一样,本质上是if的简写版本,就是条件为true就是左边的,反之则是右边的

语法格式:

条件(布尔值) ? 表达式1 : 表达式2

1
2
3
4
5
6
7
void main() {
int age = 18;

String result = age >= 18 ? "成年人" : "未成年人";

print(result);
}

switch case语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void main() {
String fruit = "apple";

switch (fruit) {
case "apple":
print("苹果");
break;
case "banana":
print("香蕉");
break;
default:
print("未知水果");
}
}

这个和C#和Java还有C++,C里的很像,但是大同小异,比如有的有break,有的没有,不过我们的dart语言里的default的最后一个没有break

对了,和java还有C#一样,这个也是分现代写法和旧写法的

1
2
3
4
5
6
7
8
9
10
11
void main() {
String fruit = "apple";

String result = switch (fruit) {
"apple" => "苹果",
"banana" => "香蕉",
_ => "未知水果"
};

print(result);
}

这个是新的写法,省略了case的和default关键字

循环

循环就不用多说了,和C#还有java里的没有区别

while循环

1
2
3
4
5
6
7
8
void main() {
int i = 0;

while (i < 5) {
print(i);
i++;
}
}

do while循环

1
2
3
4
5
6
7
8
void main() {
int i = 10;

do {
print(i);
i++;
} while (i < 5);
}

for 循环

1
2
3
4
5
void main() {
for (int i = 0; i < 5; i++) {
print(i);
}
}

for in循环

1
2
3
4
5
6
7
void main() {
List<String> fruits = ["apple", "banana", "orange"];

for (var fruit in fruits) {
print(fruit);
}
}

break和continue关键字

break(直接退出循环),continue(跳过本次)

1
2
3
4
5
6
7
8
9
10
void main() {
List<String> fruits = ["apple", "banana", "orange"];

for (var i = 0; i < fruits.length; i++) {
if (fruits[i] == "banana") {
continue;
}
print(fruits[i]);
}
}
1
2
3
4
5
6
7
8
9
10
void main() {
List<String> fruits = ["apple", "banana", "orange"];

for (var i = 0; i < fruits.length; i++) {
if (fruits[i] == "banana") {
break;
}
print(fruits[i]);
}
}

函数

函数这个都熟悉,dart的函数和java这些差不多,只是某些地方有区别

参数通常分为有参和无参,这里我就从有参和无参来分类吧

无参

普通无参函数

1
2
3
void hello() {
print("Hello");
}

返回值无参函数

1
2
3
int getNumber() {
return 10;
}

箭头写法(Lambda表达式)

但是只允许一条表达式,即只有return这一句

1
int getNumber() => 10;

调用规则

规则:

  • 函数名 + ()

有参

普通有参函数

这个也称为必选位置参数

特点

  • 必须传
  • 按顺序传(位置固定)
  • 最基础、性能最好(无额外处理)
  • 返回值类型可省略,Dart会自动推断类型为dynamic
1
2
3
4
5
6
7
8
9
10
int add(int a, int b) {
return a + b;
}

//也可以写成箭头函数(Lambda表达式)
int add(int a, int b) => a + b;

void main() {
print(add(2, 3));
}
Function 类型参数

可以把函数作为参数

语法

1
2
3
void foo(Function fn) {
fn();
}

✅ 更规范写法(推荐)

1
2
3
void foo(void Function() fn) {
fn();
}

✅ 带参数

1
2
3
void foo(int Function(int, int) calc) {
print(calc(2, 3));
}

✅ 特点

  • 强类型函数签名 ⭐
  • Dart 比 JS 严谨

可选参数(可以不传)

位置可选参数 []

语法(用 []

  • 规则:可选位置参数必须位于必传参数后面 , 采用中括号包裹
  • 语法:函数名(String a , [String?b,…..]),传递时按照顺序传递
1
2
3
void foo(int a, [int? b, int? c]) {
print('$a, $b, $c');
}

调用

1
2
3
foo(1);          // b=null, c=null
foo(1, 2); // b=2, c=null
foo(1, 2, 3); // b=2, c=3

✅ 默认值写法

1
2
3
void foo(int a, [int b = 10]) {
print('$a, $b');
}

✅ 特点

  • 可以不传
  • 必须按顺序传
  • 不能跳过中间参数 ❗
  • 通常需要 ?(可空)

❌ 错误示例

1
foo(1, , 3); // ❌ 不允许跳过

我们可以自己练习一下带返回值的写法

1
2
3
4
5
6
7
8
9
10
11
12
13
void main() {
print(add(1, 2));
print(comment("我"));
print(comment("我", "喜欢"));
}

int add(int a, int b) {
return a + b;
}

String comment(String a, [String? b, String? c = "明日方舟终末地"]) {
return a + (b ?? "") + (c ?? "");
}

image-20260416113840742

命名参数 {}

语法(用 {}

  • 特点:可选命名参数必须位于必传参数后面,采用大括号包裹
  • 语法:函数名(String a , {String?b , …}), 传递时按照参数名:值的方式进行传递,无需关注顺序
1
2
3
void foo({int? a, int? b}) {
print('$a, $b');
}

✅ 调用

1
2
foo(a: 1, b: 2);
foo(b: 2); // 可以只传一个

✅ 必填命名参数(required)

1
2
3
4
5
void foo({required int a, int? b}) {
print('$a, $b');
}
foo(a: 1); // ✅
foo(); // ❌ 报错

✅ 默认值

1
2
3
void foo({int a = 10, int b = 20}) {
print('$a, $b');
}

✅ 特点

  • 按名字传,不看顺序
  • 可以只传一部分
  • 可读性极高 ⭐⭐⭐
  • Flutter 里用得最多

✅ 适用场景

👉 参数多 / 可选多 / UI配置

例如:

1
2
3
4
5
Container(
width: 100,
height: 200,
color: Colors.red,
)

练习一下

1
2
3
4
5
6
7
8
9
10
11
12
void main() {
playerData("JohnDoe");
playerData("JaneSmith", age: 25);
playerData("Alice", level: "intermediate");
}

void playerData(String username, {int? age = 18, String? level = "beginner"}) {
print("Username: $username");
print("Age: $age");
print("Level: $level");
print('-------------------------');
}
this 参数

在类里非常常见👇

✅ 语法

1
2
3
4
5
6
class Person {
String name;
int age;

Person({required this.name, required this.age});
}

✅ 特点

  • 自动赋值
  • 常和命名参数一起用
  • Flutter 代码里遍地都是
混合参数

同样的,以上两种是可以混用的,但是有顺序要求(先位置,后命名)

正确顺序(必须记住)

1
2
3
必选位置参数
→ 可选位置参数 []
→ 命名参数 {}

✅ 示例

1
2
3
void foo(int a, [int? b], {int? c}) {
print('$a, $b, $c');
}

❌ 错误写法

1
void foo({int? a}, int b) {} // ❌ 命名参数不能在前

匿名函数

匿名函数这个在C#和java里也很常见,而且和JavaScript差不多,都可以用Function来定义函数类型

没有名字的函数

1
2
3
() {
print("hello");
}

这就是一个匿名函数。

但它本身没用,必须赋值或传递

1
2
3
4
5
var f = () {
print("hello");
};

f(); // 调用

在 Dart 里:函数也是对象,类型是 Function

1
2
3
Function f = () {
print("hello");
};

但更推荐写成:

1
2
3
void Function() f = () {
print("hello");
};

因为:

  • Function 太泛(不安全)
  • void Function() 有明确参数和返回值

带参数的匿名函数

1
2
3
var f = (int a, int b) {
return a + b;
};

或者箭头写法:

1
var f = (int a, int b) => a + b;

这个东西实际用途比较广

回调函数
1
2
3
4
5
6
7
void run(void Function() fn) {
fn();
}

run(() {
print("执行了");
});
集合操作
  1. forEach
1
2
3
4
5
var list = [1, 2, 3];

list.forEach((item) {
print(item);
});
  1. map(转换)
1
2
3
4
5
var list = [1, 2, 3];

var newList = list.map((item) {
return item * 2;
}).toList();

箭头简化:

1
var newList = list.map((item) => item * 2).toList();
  1. where(过滤)
1
2
3
4
5
var list = [1, 2, 3, 4];

var result = list.where((item) {
return item % 2 == 0;
});
返回函数(闭包)
1
2
3
4
5
6
7
8
Function makeAdder(int x) {
return (int y) {
return x + y;
};
}

var add5 = makeAdder(5);
print(add5(3)); // 8
临时逻辑(立即执行函数)
1
2
3
(() {
print("立即执行");
})();

总之就这些功能

  1. 回调函数(按钮、事件)
  2. 集合操作(map / where / forEach)
  3. 异步处理(Future / async)

  1. 返回函数(闭包)
  2. 策略模式(动态逻辑)

  1. 立即执行函数(IIFE)