Flutter网络与通信如何实现

在Flutter中实现网络通信有哪些常用的方法?我想知道如何通过HTTP请求获取数据、处理JSON响应,以及最佳实践是什么?比如用http包还是Dio库更好?另外WebSocket在Flutter中该怎么使用?还有网络状态监听和错误处理有什么需要注意的地方?求有经验的开发者分享具体代码示例和性能优化建议。

2 回复

Flutter中网络通信主要通过httpdio库实现。使用http发送GET/POST请求,处理JSON数据。dio功能更强大,支持拦截器、文件上传等。异步操作使用async/awaitFuture处理响应。

更多关于Flutter网络与通信如何实现的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


Flutter 网络通信主要通过 httpdio 库实现。以下是核心实现方法:

1. 添加依赖

pubspec.yaml 中添加:

dependencies:
  http: ^1.1.0  # 或 dio: ^5.0.0

2. 基础HTTP请求(使用 http 包)

import 'package:http/http.dart' as http;

// GET 请求
Future<void> fetchData() async {
  final response = await http.get(Uri.parse('https://api.example.com/data'));
  if (response.statusCode == 200) {
    print('返回数据: ${response.body}');
  } else {
    throw Exception('请求失败');
  }
}

// POST 请求
Future<void> postData() async {
  final response = await http.post(
    Uri.parse('https://api.example.com/post'),
    body: {'key': 'value'},
  );
  print('状态码: ${response.statusCode}');
}

3. 高级功能(推荐使用 dio)

Dio 支持拦截器、超时设置等:

import 'package:dio/dio.dart';

final dio = Dio(BaseOptions(
  baseUrl: 'https://api.example.com',
  connectTimeout: Duration(seconds: 5),
));

// 带错误处理的请求
Future<void> fetchUser() async {
  try {
    final response = await dio.get('/user/1');
    print('用户数据: ${response.data}');
  } on DioException catch (e) {
    print('错误: ${e.message}');
  }
}

// 添加拦截器
dio.interceptors.add(InterceptorsWrapper(
  onRequest: (options, handler) {
    options.headers['Authorization'] = 'Bearer token';
    return handler.next(options);
  },
));

4. 响应数据处理

解析 JSON 数据:

// 定义数据模型
class User {
  final int id;
  final String name;
  
  User({required this.id, required this.name});
  
  factory User.fromJson(Map<String, dynamic> json) {
    return User(
      id: json['id'],
      name: json['name'],
    );
  }
}

// 使用
User user = User.fromJson(response.data);

5. 状态管理建议

  • 使用 FutureBuilderStreamBuilder 处理异步状态
  • 复杂应用可搭配 Provider/Bloc 等状态管理库

关键注意事项:

  1. android/app/src/main/AndroidManifest.xml 中添加网络权限:
<uses-permission android:name="android.permission.INTERNET"/>
  1. 处理 HTTPS 证书验证(如需自签名证书需额外配置)
  2. 主线程禁止同步网络请求

推荐优先使用 Dio,它提供了更完善的错误处理、文件上传/下载和请求取消等功能。

回到顶部