Flutter 学习之路(三)

tech2025-12-21  2

上篇文章主要说的是 Flutter 环境 常用的开源库的使用的安装,那么今天我们就说一下项目常用的网络请求库dio、dio_cookie_manager这两个库。

dio这个库是我们常用的网络请求库,通过这个进行网络数据的请求,而我们在开发过程中经常我们会传cookie,这个时候我们就使用到了dio_cookie_manager这个库。负责管理cookie,当我们请求这两个库的时候我们只需要连个库连用就可以实现安卓和iOS的网络请求

那我们如何使用呢。下面是我们项目里对这两个框架的封装,这样我们就可以更加方便的使用这两个库。

首先我们先声明一个网络请求类:

HttpCloudUtils

接下来是方法的实现

import 'package:dio/adapter.dart'; import 'package:dio/dio.dart'; import 'dart:convert'; import 'dart:io'; import 'package:cookie_jar/cookie_jar.dart'; import 'package:dio_cookie_manager/dio_cookie_manager.dart'; import 'package:shotel/constant/DataBase.dart'; import 'package:shotel/constant/Url.dart'; import 'package:shotel/data/base_cloud_data.dart'; //要查网络请求的日志可以使用过滤<net> class HttpCloudUtils { static const String POST = "post"; //post请求 static void post(String url, Function callBack, {Map<String, dynamic> params, Function errorCallBack, String contentType = Headers.formUrlEncodedContentType}) async { print(params); _request(url, callBack, contentType, method: POST, params: params, errorCallBack: errorCallBack); } //具体的还是要看返回数据的基本结构 //公共代码部分 static void _request(String url, Function callBack, String contentType, {String method, Map<String, dynamic> params, String path, Function errorCallBack}) async { String errorMsg = ""; int statusCode; BaseOptions baseOptions = new BaseOptions( baseUrl: Url.BASE_CLOUD_URL, connectTimeout: 15000, receiveTimeout: 15000, responseType: ResponseType.plain, contentType: contentType, headers: { "Authorization": DataBase.CLOUD_TOKEN, } ); Dio dio = new Dio(baseOptions); var cookieJar = CookieJar(); dio.interceptors.add(CookieManager(cookieJar)); //简单粗暴方式处理校验证书方法 (dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate = (client) { client.badCertificateCallback=(X509Certificate cert, String host, int port){ return true; }; }; Response response; try { if (params != null && params.isNotEmpty) { response = await dio.post(url, data: params); } else { response = await dio.post(url); } statusCode = response.statusCode; //处理错误部分 if (statusCode < 0) { errorMsg = "网络请求错误,状态码:" + statusCode.toString(); _handError(errorCallBack, errorMsg); return; } if (callBack != null) { var result = response.data.toString(); print("返回数据:" + result); var data = json.decode(result); BaseCloudData baseData = BaseCloudData.fromJson(data); if (baseData.status == 200) { callBack(data); } else { _handError(errorCallBack, baseData.error); } } } catch (exception) { String code = exception.message.toString(); print(code); _handError(errorCallBack, "服务异常"); } } //处理异常 static void _handError(Function errorCallback, String errorMsg) { if (errorCallback != null) { errorCallback(errorMsg); } print("<net> errorMsg :" + errorMsg); } static String queryParam(String url, Map<String, dynamic> param) { StringBuffer sb = new StringBuffer("?"); param.forEach((key, value) { sb.write("$key" + "=" + "$value" + "&"); }); String paramStr = sb.toString(); paramStr = paramStr.substring(0, paramStr.length - 1); url += paramStr; return url; } }

到此这网络框架的二次封装,其中两个字段和两个类需要特别说明一下

第一个

import 'package:shotel/constant/DataBase.dart';

这个类使用的是:

DataBase.CLOUD_TOKEN

这个是请求所需要的token,如果不需要可以不传或者传空串

第二个

import 'package:shotel/constant/Url.dart';

这个类使用的是:

Url.BASE_CLOUD_URL

这里是网络请求的域名或者ip,全局统一使用

以上这两个可以给句个人习惯自行处理。

下面我们要如何使用呢?

HttpCloudUtils.post( "去除域名借口的后半部分", (data) { if (mounted) { setState(() { //这里我们可以将返回的数据处理并展示到页面上,更改页面信息必须要要在这个方法中进行 }); } }, params: null, errorCallBack: (errorMsg) { Fluttertoast.showToast(msg: errorMsg); });

到此网络框架的封装和使用就完事了。

最新回复(0)