Flutter 网络请求封装
2025-09-30 08:47
Flutter
0
0
0
0
标题录入
封面图
在 Flutter 中,为了提高代码的可维护性和复用性,通常会将网络请求进行封装。常见的做法是使用 `http` 或 `dio` 等第三方库来发送 HTTP 请求,并对其进行统一的错误处理、拦截器、请求配置等。 下面是一个基于 `http` 包的网络请求封装示例: --- ## ✅ 一、添加依赖 在 `pubspec.yaml` 文件中添加依赖: ```yaml dependencies: flutter: sdk: flutter http: ^0.13.5 ``` --- ## ✅ 二、创建网络请求工具类(NetworkUtil) ```dart import 'dart:convert'; import 'package:http/http.dart' as http; class NetworkUtil { static final String baseUrl = "https://api.example.com"; // 替换为你的 API 地址 // 发送 GET 请求 static Future<dynamic> get(String path, {Map<String, String>? headers}) async { final response = await http.get( Uri.parse('$baseUrl$path'), headers: headers, ); return _handleResponse(response); } // 发送 POST 请求 static Future<dynamic> post(String path, {Map<String, String>? headers, dynamic body}) async { final response = await http.post( Uri.parse('$baseUrl$path'), headers: headers, body: body is Map ? jsonEncode(body) : body, ); return _handleResponse(response); } // 处理响应 static dynamic _handleResponse(http.Response response) { if (response.statusCode >= 200 && response.statusCode < 300) { return jsonDecode(response.body); } else { throw Exception('网络请求失败:${response.reasonPhrase}'); } } } ``` --- ## ✅ 三、使用示例 ```dart void fetchData() async { try { var data = await NetworkUtil.get('/users'); print(data); } catch (e) { print('Error: $e'); } } ``` --- ## ✅ 四、进阶封装(使用 Dio) 如果你希望更强大的功能(如拦截器、超时设置、自动刷新 token 等),推荐使用 `dio` 库: ### 1. 添加依赖 ```yaml dependencies: dio: ^4.0.0 ``` ### 2. 创建 Dio 封装类 ```dart import 'package:dio/dio.dart'; class DioUtil { static final Dio _dio = Dio(); static void init(String baseUrl) { _dio.options.baseUrl = baseUrl; _dio.interceptors.add(InterceptorsWrapper( onRequest: (options, handler) { // 请求前处理 print("请求地址: ${options.uri}"); return handler.next(options); }, onResponse: (response, handler) { // 响应后处理 print("响应数据: ${response.data}"); return handler.next(response); }, onError: (e, handler) { // 错误处理 print("错误信息: ${e.message}"); return handler.next(e); }, )); } static Future<dynamic> get(String path, {Map<String, dynamic>? queryParameters}) async { try { final response = await _dio.get(path, queryParameters: queryParameters); return response.data; } catch (e) { throw Exception('请求失败: $e'); } } static Future<dynamic> post(String path, {Map<String, dynamic>? data}) async { try { final response = await _dio.post(path, data: data); return response.data; } catch (e) { throw Exception('请求失败: $e'); } } } ``` ### 3. 使用示例 ```dart void main() { DioUtil.init("https://api.example.com"); DioUtil.get('/users').then((data) => print(data)); } ``` --- ## ✅ 五、总结 | 方法 | 功能 | |------|------| | `http` | 简单易用,适合基础网络请求 | | `Dio` | 功能强大,支持拦截器、超时、文件上传等,适合复杂项目 | --- 如果你有特定需求(比如带 Token 的请求、缓存、错误码处理等),也可以告诉我,我可以帮你进一步优化封装。
上一篇:
Flutter 全局变量及共享状态
下一篇:
Element、BuildContext和RenderObject
标题录入,一次不能超过6条
返回顶部
留言
留言
评论