Skip to main content

回调函数

1719370690726

计算机编程中,回调函数或简称 回调 (callback),是指对某一段可执行代码引用 "引用 (程序设计)"),它被作为参数 "参数 (程序设计)")传递给另一段代码;预期这段代码将回调(执行)这个回调函数作为自己工作的一部分。这种执行可以是即时的,如在同步回调之中;也可以在后来的时间点上发生,如在异步回调之中。

编程语言以不同方式支持回调,经常将它们实现为子例程lambda表达式 "块 (编程)")或函数指针

回调函数的主要作用

  1. 异步操作 : 回调函数允许在异步操作(如网络请求、文件读取、定时器等)完成后执行特定的逻辑,而不会阻塞主线程。这样可以提高程序的响应性和性能。
  2. 事件处理 : 回调函数用于处理用户交互事件,如按钮点击、鼠标移动、键盘输入等。事件发生时,预先定义的回调函数会被调用,执行相应的操作。
  3. 代码解耦 : 回调函数有助于将功能模块分离,使代码更加模块化和可重用。通过将逻辑封装在回调函数中,可以实现更灵活的代码结构。
  4. 延迟执行 : 回调函数可以用于在特定条件满足时或一段时间之后执行代码。例如,定时器和动画都是基于回调函数的。
  5. 高阶函数 : 回调函数是高阶函数的基础。高阶函数是指接受函数作为参数或返回一个函数的函数。回调函数使得函数可以作为数据传递,提升代码的灵活性和抽象层次。

示例

异步操作

void fetchData(Function(String) callback) {
Future.delayed(Duration(seconds: 2), () {
String data = "Fetched data";
callback(data);
});
}void main() {
print('Fetching data...');
fetchData((data) {
print(data); // 输出: Fetched data
});
}

在这个例子中,fetchData 函数在异步操作完成后调用回调函数 callback 来处理结果。

事件处理

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Callback Example'),
),
body: Center(
child: MyButton(),
),
),
);
}
}

class MyButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ElevatedButton(
onPressed: () {
_showMessage(context, 'Button clicked!');
},
child: Text('Click me'),
);
}

void _showMessage(BuildContext context, String message) {
final snackBar = SnackBar(content: Text(message));
ScaffoldMessenger.of(context).showSnackBar(snackBar);
}
}

在这个 Flutter 示例中,onPressed 属性接受一个回调函数,当按钮被点击时调用该回调函数。

高阶函数

void processList(List<int> list, int Function(int) callback) {
for (var i = 0; i < list.length; i++) {
list[i] = callback(list[i]);
}
}

void main() {
var numbers = [1, 2, 3, 4];
processList(numbers, (n) => n * 2);
print(numbers); // 输出: [2, 4, 6, 8]
}

在这个例子中,processList 函数接受一个列表和一个回调函数,将回调函数应用于列表中的每个元素。