flutter中 Future 详细介绍

我来为您详细介绍Flutter中Future的具体用法、使用场景,以及与JavaScript Promise的异同。

Future 基本概念

Future是Dart中表示异步操作结果的对象,类似于JavaScript中的Promise。它代表一个可能在未来某个时间点完成或失败的计算。

Future 基本用法

1. 创建Future

dart 复制代码
// 1. 使用Future构造函数
Future<String> fetchUserData() {
  return Future(() {
    // 模拟异步操作
    return "用户数据";
  });
}

// 2. 使用Future.delayed(您代码中的用法)
Future.delayed(Duration(seconds: 2), () {
  return "延迟2秒后返回的数据";
});

// 3. 使用Future.value(立即完成的Future)
Future<String> immediateFuture = Future.value("立即完成的值");

2. Future的链式操作

dart 复制代码
Future<int> fetchNumber() {
  return Future.delayed(Duration(seconds: 1), () => 42);
}

void processFuture() {
  fetchNumber()
    .then((number) {
      print('获取到的数字: $number');
      return number * 2;
    })
    .then((doubled) {
      print('加倍后的数字: $doubled');
      return doubled + 10;
    })
    .then((result) {
      print('最终结果: $result');
    })
    .catchError((error) {
      print('发生错误: $error');
    })
    .whenComplete(() {
      print('操作完成,无论成功或失败都会执行');
    });
}

与JavaScript Promise的异同

相同点:

  • 都表示异步操作的结果
  • 都支持链式调用(then/catch)
  • 都有错误处理机制
  • 都可以处理异步操作的成功和失败

不同点:

特性 Dart Future JavaScript Promise
创建方式 Future(() => value) new Promise((resolve, reject) => {})
错误处理 catchError() catch()
最终执行 whenComplete() finally()
异步等待 await future await promise
多个操作 Future.wait() Promise.all()

实际使用案例

案例1:HTTP请求

dart 复制代码
import 'package:http/http.dart' as http;

Future<void> fetchUserProfile() async {
  try {
    final response = await http.get(Uri.parse('https://api.example.com/user'));
    
    if (response.statusCode == 200) {
      print('用户数据: ${response.body}');
    } else {
      throw Exception('请求失败: ${response.statusCode}');
    }
  } catch (e) {
    print('网络请求错误: $e');
  }
}

// 使用then的等价写法
void fetchUserProfileWithThen() {
  http.get(Uri.parse('https://api.example.com/user'))
    .then((response) {
      if (response.statusCode == 200) {
        print('用户数据: ${response.body}');
      } else {
        throw Exception('请求失败: ${response.statusCode}');
      }
    })
    .catchError((error) {
      print('网络请求错误: $error');
    });
}

案例2:文件操作

dart 复制代码
import 'dart:io';

Future<void> readFileContent() async {
  final file = File('path/to/file.txt');
  
  try {
    final contents = await file.readAsString();
    print('文件内容: $contents');
  } catch (e) {
    print('读取文件错误: $e');
  }
}

案例3:多个Future并行处理

dart 复制代码
Future<void> fetchMultipleData() async {
  final future1 = http.get(Uri.parse('https://api.example.com/users'));
  final future2 = http.get(Uri.parse('https://api.example.com/posts'));
  final future3 = http.get(Uri.parse('https://api.example.com/comments'));
  
  try {
    final results = await Future.wait([future1, future2, future3]);
    
    print('用户数据: ${results[0].body}');
    print('帖子数据: ${results[1].body}');
    print('评论数据: ${results[2].body}');
  } catch (e) {
    print('部分请求失败: $e');
  }
}

案例4:超时控制

dart 复制代码
Future<void> fetchWithTimeout() async {
  final future = http.get(Uri.parse('https://api.example.com/slow'));
  
  try {
    final response = await future.timeout(Duration(seconds: 5));
    print('请求成功: ${response.body}');
  } on TimeoutException {
    print('请求超时');
  } catch (e) {
    print('其他错误: $e');
  }
}

案例5:在Flutter Widget中使用FutureBuilder

dart 复制代码
class UserProfileWidget extends StatelessWidget {
  final Future<User> userFuture;
  
  UserProfileWidget({required this.userFuture});
  
  @override
  Widget build(BuildContext context) {
    return FutureBuilder<User>(
      future: userFuture,
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.waiting) {
          return CircularProgressIndicator();
        } else if (snapshot.hasError) {
          return Text('错误: ${snapshot.error}');
        } else if (snapshot.hasData) {
          return Text('用户名: ${snapshot.data!.name}');
        } else {
          return Text('暂无数据');
        }
      },
    );
  }
}

您代码中Future用法的解释

基于您提供的代码片段:

dart 复制代码
Future.delayed(Duration(seconds: 2), () {
  print('Response status: ${response.statusCode}');
  print('Response body: ${response.body}');
  return 100;
})
.then((value) {
  print('value: $value');
})
.whenComplete(() {
  print('whenComplete');
});

这个代码的含义是:

  1. 延迟2秒执行异步操作
  2. 打印响应状态和内容,返回数字100
  3. 通过then处理返回的值
  4. 无论成功或失败,最后都会执行whenComplete

Future与Stream的区别

  • Future:表示单个异步操作的结果(一次性)
  • Stream:表示一系列异步事件的序列(多次)
dart 复制代码
// Future - 一次性
Future<int> getSingleValue() async {
  return 42;
}

// Stream - 多次
Stream<int> getMultipleValues() async* {
  for (int i = 0; i < 5; i++) {
    yield i;
    await Future.delayed(Duration(seconds: 1));
  }
}

Future是Flutter异步编程的核心概念,熟练掌握它的使用对于开发高质量的Flutter应用至关重要。

相关推荐
LaughingZhu6 小时前
Product Hunt 每日热榜 | 2026-05-21
前端·人工智能·经验分享·chatgpt·html
怕浪猫6 小时前
Electron 开发实战(一):从零入门核心基础与环境搭建
前端·electron·ai编程
小鹏linux7 小时前
Ubuntu 22.04 部署开源免费具有精美现代web页面的Casdoor账号管理系统
linux·前端·ubuntu·开源·堡垒机
前端若水8 小时前
会话管理:创建、切换、删除对话历史
前端·人工智能·python·react.js
Bigger8 小时前
mini-cc:一个轻量级 AI 编程助手的诞生
前端·ai编程·claude
涵涵(互关)8 小时前
Naive-ui树型选择器只显示根节点
前端·ui·vue
BY组态8 小时前
Ricon组态系统最佳实践:从零开始构建物联网监控平台
前端·物联网·iot·web组态·组态
BY组态8 小时前
Ricon组态系统vs传统组态软件:为什么选择新一代Web组态平台
前端·物联网·iot·web组态·组态
SoaringHeart8 小时前
Flutter进阶:OverlayEntry 插入图层管理器 NOverlayZIndexManager
前端·flutter
放下华子我只抽RuiKe58 小时前
React 从入门到生产(四):自定义 Hook
前端·javascript·人工智能·深度学习·react.js·自然语言处理·前端框架