基本函數
// 沒有返回值的函數
void sayHello() {
print('Hello, Dart!');
}
// 有返回值的函數
int add(int a, int b) {
return a + b;
}
簡寫函數
int subtract(int a, int b) => a - b; // 使用箭頭函數簡寫
等價于:
int subtract(int a, int b) {
return a - b;
};
函數參數
1.可選參數:
使用方括號 [] 來定義可選參數,未傳遞時,參數會為 null。
void greet(String name, [String? message]) {
print('Hello, $name!');
if (message != null) {
print(message);
}
}
greet('Alice'); // 輸出: Hello, Alice!
greet('Bob', 'Welcome to Dart!'); // 輸出: Hello, Bob! Welcome to Dart!
2.命名參數:
使用花括號 {} 定義命名參數,調用函數時明確傳遞參數名,默認值可以在定義參數時賦予。
void introduce({required String name, int age = 18}) {
print('My name is $name, I am $age years old.');
}
introduce(name: 'Alice'); // 輸出: My name is Alice, I am 18 years old.
introduce(name: 'Bob', age: 25); // 輸出: My name is Bob, I am 25 years old.
required 修飾符:強制調用函數時必須傳遞這個參數,否則會報錯
匿名函數(Lambda 表達式)
var multiply = (int x, int y) {
return x * y;
};
print(multiply(3, 4)); // 輸出 12
匿名函數也可以使用箭頭函數的簡寫形式:
var divide = (int x, int y) => x / y;
print(divide(8, 2)); // 輸出 4.0
回調函數
回調函數是一種常見的函數傳遞方式,通常在某個函數執行完畢后,調用傳遞進來的函數來執行特定的操作。
void performOperation(int a, int b, Function operation) {
var result = operation(a, b);
print('Result: $result');
}
void main() {
performOperation(5, 3, (a, b) => a + b); // 回調函數為加法操作
performOperation(10, 2, (a, b) => a - b); // 回調函數為減法操作
}
在這個例子中,performOperation 函數接收一個操作函數 operation,然后將該函數應用于傳遞的參數。
常見回調場景
回調函數在異步操作、用戶界面交互、事件處理等場景非常常見。比如,Flutter 中的按鈕點擊事件可以傳遞一個回調函數:
ElevatedButton(
onPressed: () {
print('Button Pressed');
},
child: Text('Press me'),
)
在這里,onPressed 參數就是一個回調函數,它會在按鈕被點擊時執行。
將函數作為對象傳遞
Dart 中的函數是一等公民,它們可以作為對象被賦值給變量、作為參數傳遞給其他函數、甚至作為返回值從函數中返回。
函數賦值給變量
int add(int a, int b) => a + b;
var operation = add; // 將函數賦值給變量
print(operation(5, 3)); // 輸出 8
在這個例子中,函數 add 被賦值給 operation,之后 operation 就可以像函數一樣調用。
函數作為參數傳遞
函數可以作為另一個函數的參數,這使得函數非常靈活和強大。
void executeOperation(int a, int b, Function operation) {
print('Result: ${operation(a, b)}');
}
int multiply(int x, int y) => x * y;
void main() {
executeOperation(4, 5, multiply); // 輸出: Result: 20
}
函數作為返回值
函數也可以作為另一個函數的返回值,常用于創建閉包或高階函數。
Function makeAdder(int n) {
return (int i) => n + i;
}
void main() {
var addFive = makeAdder(5); // 返回一個加 5 的函數
print(addFive(10)); // 輸出 15
}
在這個例子中,makeAdder 返回了一個匿名函數,這個匿名函數可以將 n 和傳入的 i 相加。通過 makeAdder(5) 創建了一個專門加 5 的函數 addFive
閉包
Dart 的閉包允許函數捕獲其外部作用域的變量,即使函數執行完成后,這些變量依然能夠被訪問。
Function counter() {
int count = 0;
return () {
count++;
return count;
};
}
void main() {
var myCounter = counter();
print(myCounter()); // 輸出 1
print(myCounter()); // 輸出 2
}
在這個例子中,counter 函數返回了一個閉包,這個閉包能夠訪問并修改其外部作用域中的 count 變量。