函式
函式宣告的方式跟 Java 一樣,在此省略不說。
函式只有一行 =>
若函式內的程式碼只有一行,使用=>。
1
2
3
4
5
6
void main() {
var res = sum(1, 2);
print(res);
}
int sum(int a, int b) => a + b;
3
傳回值類型
沒有傳回值類型
dart 會自動推導類型。
1
2
3
4
5
6
7
8
9
10
void main() {
var res = func2();
print(res.runtimeType);
print(res.startsWith("H"));
print(res);
}
func2() {
return "Hello World";
}
String
true
Hello World
有傳回值類型
void 也是類型的一種。
1
2
3
4
5
6
7
void func1() {
print("func1");
}
String func3() {
return "func3";
}
函式參數
- 必要參數 (required positional parameters)
- 可選位置參數
[](optional positional parameters) - 可選命名參數
{}(Named parameters)
必要參數
呼叫函式時,參數一定要傳遞,並且按照位置傳遞。
1
2
3
4
5
6
7
void main() {
func1(100);
}
void func1(int param1) {
print("param1: $param1");
}
可選位置參數
可以不傳參數,也可以只傳一個,但要按照順序傳。
參數語法:
[參數1?, 參數2?]
[參數1 = 預設值, 參數2 = 預設值]
若參數沒給預設值,參數後面要有?問號,代表參數是nullable類型(可以是null),預設值也為null。
若參數有給預設值,參數後面不用有?問號。
可選位置參數 null
若參數沒給預設值,參數後面要有?問號。
1
2
3
4
5
6
7
8
9
10
11
void main() {
// 可以不傳參數
func3();
// 可以只傳一個
func3("a");
func3("a", 10);
}
void func3([String? a, int? b]) {
print("a: $a, b: $b");
}
a: null, b: null
a: a, b: null
a: a, b: 10
可選位置參數 non-null
若參數有給預設值,參數後面不用有?問號。
1
2
3
4
5
6
7
8
9
void main() {
func3();
func3("a");
func3("a", 10);
}
void func3([String a = "Hi", int b = 0]) {
print("a: $a, b: $b");
}
a: Hi, b: 0
a: a, b: 0
a: a, b: 10
必要參數 + 可選位置參數
如果有「必要參數」,「可選位置參數」放在「必要參數」的後面。
1
2
3
4
5
6
7
8
9
void main() {
func3("Hello");
func3("Hello", "a");
func3("Hello", "a", 10);
}
void func3(String param1, [String? a, int? b]) {
print("param1: $param1, a: $a, b: $b");
}
param1: Hello, a: null, b: null
param1: Hello, a: a, b: null
param1: Hello, a: a, b: 10
可選命名參數
可以不傳參數,也可以只傳一個,傳遞時要加上參數名,不用按照順序傳。
使用大括號包住參數名,語法:
{類型 參數名1?, 類型 參數名2?}
{類型 參數名1 = 預設值, 類型 參數名2 = 預設值}
函式呼叫語法,使用冒號:分隔。
函式(參數名1: 參數, 參數名2: 參數)
傳遞時要加上參數名,不用按照順序傳。
1
2
3
4
5
6
7
8
9
void main() {
func4();
func4(name: "Cici");
func4(age: 18, name: "Cici");
}
void func4({String? name, int? age}) {
print("name: $name, age: $age");
}
name: null, age: null
name: Cici, age: null
name: Cici, age: 18
1
2
3
4
5
6
7
8
9
void main() {
func4();
func4(name: "Cici");
func4(age: 18, name: "Cici");
}
void func4({String name = "none", int age = 0}) {
print("name: $name, age: $age");
}
name: none, age: 0
name: Cici, age: 0
name: Cici, age: 18
必要參數 + 可選命名參數
如果有「必要參數」,「可選命名參數」放在「必要參數」的後面。
不可以「必要參數」+ 「可選命名參數」 + 「可選位置參數」。
匿名函式
所謂的匿名函式,就是把「程式邏輯」作為參數,傳遞給函式。
匿名函式類型 Function
參數類型為Function。
1
2
3
void func1(Function callback) {
callback();
}
無參數匿名函式語法
() {
程式邏輯
}
把print("Hello"); 的程式邏輯,傳給參數。
1
2
3
4
5
6
7
8
9
void main() {
func1(() {
print("Hello");
});
}
void func1(Function callback) {
callback();
}
有參數匿名函式語法
1
2
3
4
5
6
7
8
9
void main() {
func1((String? param1) {
print("Hello $param1");
});
}
void func1(Function callback) {
callback("Bill");
}
Hello Bill
匿名函式指派給變數
語法
Function 變數名 = () {
程式碼
}
1
2
3
4
5
6
7
8
9
10
11
void main() {
func1(function1, "Bill");
}
Function function1 = (String? param1) {
print("Hello $param1");
};
void func1(Function callback, String? name) {
callback(name);
}
Hello Bill