以下是 Dart 语言中函数语法的 详细实例说明,涵盖了所有常用写法
- 基本语法
- 参数类型(必选、可选、命名、默认值)
- 匿名函数、箭头函数
- 高阶函数(函数作为参数/返回值)
- 异步函数(async / await)
1. 函数的基本语法
int add(int a, int b) {
return a + b;
}
void main() {
print(add(2, 3)); // 输出:5
}
- int:返回类型
- add:函数名
- (int a, int b):参数
- return:返回结果
可选参数(位置和命名)
-
位置可选参数(使用 [])
String greet(String name, [String? title]) {
return title == null ? 'Hello name' : 'Hello title $name';
}void main() {
print(greet('Tom')); // Hello Tom
print(greet('Tom', 'Dr.')); // Hello Dr. Tom
} -
命名可选参数(使用 {})
String greet2({required String name, String title = 'Mr.'}) {
return 'Hello title name';
}void main() {
print(greet2(name: 'Jerry')); // Hello Mr. Jerry
print(greet2(name: 'Jerry', title: 'Dr.')); // Hello Dr. Jerry
} -
默认参数值
int multiply(int a, [int b = 2]) {
return a * b;
}void main() {
print(multiply(4)); // 8
print(multiply(4, 3)); // 12
} -
箭头函数(简写)
int square(int x) => x * x;
void main() {
print(square(5)); // 25
} -
只能用于单表达式函数
-
自动推断 return
-
5匿名函数(无名字的函数)
void main() {
var list = ['apple', 'banana', 'cherry'];list.forEach((item) { print('Fruit: $item'); });
}
-
函数作为参数(高阶函数)
void printResult(int a, int b, int Function(int, int) operation) {
print('结果:${operation(a, b)}');
}void main() {
printResult(10, 5, (a, b) => a + b); // 结果:15
printResult(10, 5, (a, b) => a - b); // 结果:5
} -
函数作为返回值(闭包)
Function createMultiplier(int factor) {
return (int value) => value * factor;
}void main() {
var triple = createMultiplier(3);
print(triple(4)); // 12
} -
异步函数(async / await)
Future<String> fetchData() async {
await Future.delayed(Duration(seconds: 2));
return '数据加载完毕';
}void main() async {
print('开始加载');
String data = await fetchData();
print(data); // 数据加载完毕
} -
类型推断函数(无返回类型)
sayHi(name) {
print('Hi, $name!');
}
类型 | 写法示例 |
---|---|
普通函数 | int sum(int a, int b) {...} |
箭头函数 | int square(int x) => x * x; |
匿名函数 | () => print('hi') |
高阶函数 | (int a, int b, Function op) |
默认参数 | add(int a, [int b = 2]) |
命名参数 | greet({String name}) |
异步函数 | Future<String> getData() async {...} |
示例
import 'package:flutter/material.dart';
class GreetingPage extends StatefulWidget {
@override
_GreetingPageState createState() => _GreetingPageState();
}
class _GreetingPageState extends State<GreetingPage> {
final TextEditingController _nameController = TextEditingController();
String _greeting = '';
bool _isLoading = false;
// 普通函数:生成问候语
String _generateGreeting(String name) {
return '你好,$name,欢迎来到 Flutter 世界!';
}
// 异步函数:模拟加载过程(网络请求)
Future<void> _handleGreeting() async {
String name = _nameController.text.trim();
if (name.isEmpty) {
_showSnackBar('请输入你的名字');
return;
}
setState(() => _isLoading = true);
// 模拟网络延迟
await Future.delayed(Duration(seconds: 2));
setState(() {
_greeting = _generateGreeting(name); // 调用普通函数
_isLoading = false;
});
}
// 箭头函数:显示提示
void _showSnackBar(String msg) =>
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(msg)));
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('问候示例')),
body: Padding(
padding: const EdgeInsets.all(20.0),
child: Column(
children: [
TextField(
controller: _nameController,
decoration: InputDecoration(labelText: '请输入你的名字'),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: _isLoading ? null : _handleGreeting,
child: _isLoading
? CircularProgressIndicator(color: Colors.white)
: Text('点击问候'),
),
SizedBox(height: 30),
if (_greeting.isNotEmpty)
Text(
_greeting,
style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
),
],
),
),
);
}
}
类型 | 函数名 / 用法 | 说明 |
---|---|---|
普通函数 | _generateGreeting() |
返回问候字符串 |
异步函数 | _handleGreeting() |
模拟网络请求、更新状态 |
箭头函数 | _showSnackBar() |
简化写法:()=> |
回调函数 | onPressed: _handleGreeting |
按钮点击绑定函数 |
函数返回一个对象(基础写法)
-
假设有一个类 User:
class User {
String name;
int age;User({required this.name, required this.age}); @override String toString() => 'User(name: $name, age: $age)';
}
-
函数返回 User 对象:
User createUser(String name, int age) {
return User(name: name, age: age);
} -
调用:
void main() {
User user = createUser('Alice', 30);
print(user); // 输出:User(name: Alice, age: 30)
}
✅ 二、函数返回一个对象列表(List)
List<User> getUsers() {
return [
User(name: 'Tom', age: 25),
User(name: 'Jerry', age: 28),
];
}
void main() {
var users = getUsers();
for (var user in users) {
print(user);
}
}
✅ 三、箭头函数返回对象(简洁写法)
User getAdmin() => User(name: 'Admin', age: 99);
✅ 四、异步函数返回对象(Future)
Future<User> fetchUser() async {
await Future.delayed(Duration(seconds: 1)); // 模拟延迟
return User(name: 'RemoteUser', age: 22);
}
void main() async {
User user = await fetchUser();
print(user); // 输出:User(name: RemoteUser, age: 22)
}
✅ 五、工厂函数(工厂构造返回对象)
class Product {
final String name;
final double price;
Product(this.name, this.price);
// 工厂函数:从 JSON 创建对象
factory Product.fromJson(Map<String, dynamic> json) {
return Product(json['name'], json['price']);
}
}
Product getProductFromJson() {
Map<String, dynamic> json = {'name': 'iPhone', 'price': 999.0};
return Product.fromJson(json);
}
:函数返回对象的写法
返回类型 | 示例代码 |
---|---|
返回单个对象 | User getUser() { return User(...); } |
返回对象列表 | List<User> getUsers() { ... } |
箭头返回对象 | User getUser() => User(...); |
异步返回对象 | Future<User> fetchUser() async { ... } |
工厂函数生成对象 | Product.fromJson({...}) |