dio封装dart文件,包含get,post请求和自定义动态headers

import 'package:dio/dio.dart';
import 'dart:convert';
import 'package:micro_course/http/ResultCode.dart';
import 'package:micro_course/http/GlobalConfig.dart';
class DioManger{
  static DioManger _instance;
  static DioManger getInstance() {
    if (_instance == null) {
      _instance = new DioManger();
    return _instance;
  Dio dio = new Dio();
  DioManger(){
//    dio.options.headers = {
//    默认headers
//    };
    dio.options.baseUrl = "https://keep-portal.kuaizaixuetang.com/";
    dio.options.connectTimeout = 5000;
    dio.options.receiveTimeout = 3000;
  get(String url,Map params,Map<String,String> headers,Function successCallBack,Function errorCallBack) async{
   _requestHttp(url,headers,successCallBack,'get',params,errorCallBack);
  post(String url,params,Map<String,String> headers,Function successCallBack,Function errorCallBack) async{
   _requestHttp(url, headers,successCallBack,'post',params,errorCallBack);
  _requestHttp(String url ,Map<String,String> headers,Function successCallBack,[
    String method, Map params, Function errorCallBack
  ]) async{
    Response response;
      if(headers != null){
        ///显示指定Map的限定类型 动态添加headers
        dio.options.headers.addAll(new Map<String,String>.from(headers));
      if (method == 'get') {
        if (params != null && params.isNotEmpty) {
          response = await dio.get(url, queryParameters: params);
        } else {
          response = await dio.get(url);
      } else if (method == 'post') {
        if (params != null && params.isNotEmpty) {
          response = await dio.post(url, data: params);
        } else {
          response = await dio.post(url);
    }on DioError catch(error){
      // 请求错误处理
      Response errorResponse;
      if (error.response != null) {
        errorResponse = error.response;
      } else {
        errorResponse = new Response(statusCode: 666);
      // 请求超时
      if (error.type == DioErrorType.CONNECT_TIMEOUT) {
        errorResponse.statusCode = ResultCode.CONNECT_TIMEOUT;
      // 一般服务器错误
      else if (error.type == DioErrorType.RECEIVE_TIMEOUT) {
        errorResponse.statusCode = ResultCode.RECEIVE_TIMEOUT;
      // debug模式才打印
      if (GlobalConfig.isDebug) {
        print('请求异常: ' + error.toString());
        print('请求异常url: ' + url);
        print('请求头: ' + dio.options.headers.toString());
        print('method: ' + dio.options.method);
      _error(errorCallBack, error.message);
      return '';
    // debug模式打印相关数据
    if (GlobalConfig.isDebug) {
      print('请求url: ' + url);
      print('请求头: ' + dio.options.headers.toString());
      if (params != null) {
        print('请求参数: ' + params.toString());
      if (response != null) {
        print('请求结果: ' + response.toString());
//    String dataStr = json.encode(response.data);
//    Map<String, dynamic> dataMap = json.decode(dataStr);
//    if (dataMap == null || dataMap['state'] == 0) {
//      _error(errorCallBack, '错误码:' + dataMap['errorCode'].toString() + ',' + response.data.toString());
//    }else if (successCallBack != null) {
//      successCallBack(dataMap);
//    }
    successCallBack(response.toString());
  _error(Function errorCallBack, String error) {
    if (errorCallBack != null) {
      errorCallBack(error);

get请求使用:

  ///获取用户课程信息
  void getUserCourseList(LoginMsg loginMsg) {
    ///显示指定Map的限定类型
    Map<String,String> parms = {"student_id":loginMsg.data.studentId.toString()};
    Map<String,String> headers = {"token":loginMsg.data.loginToken.toString()};
    DioManger.getInstance().get(
        APIConfig.GET_COURSE_LIST,
        parms,
        headers,
        (data){
          print("获取课程列表成功:"+data.toString());
          /// 登录成功发送全局事件
            bus.emit('login',loginMsg);
        (error){
          print("获取课程列表失败:"+error.toString());

post请求示例:

 void login(Map<String, String> params,BuildContext context) {
    DioManger.getInstance().post(
        APIConfig.LOGIN,
        params,null, (data){
          setState(() {
            print("登录成功:"+data.toString());
            Map<String, dynamic> jsonMsg = json.decode(data.toString());
            LoginMsg loginMsg = LoginMsg.fromJson(jsonMsg);
            print("json转实体类:"+loginMsg.toString());
            ///更新UI
//            Navigator.pushReplacement(context, MaterialPageRoute(
//                builder: (context) => BottomNavigationWidget(),
//                settings: RouteSettings(
//                arguments:jsonMsg,
//               ),
//            ));
           getUserCourseList(loginMsg);
        }, (error){
          setState(() {
          print("登录异常:"+error.toString());

json解析错误处理

类似 type ‘_InternalLinkedHashMap<dynamic, dynamic>’ is not a subtype of type ‘Map<String, dynamic>’ 这种常见异常是因为dynamic这个类型要明确一下,上述例子中此处的修改已经做了注释了,传餐时候使用Map<String,String>这种明确泛型类型的就可以。

dio封装dart文件,包含get,post请求和自定义动态headersimport 'package:dio/dio.dart';import 'dart:convert';import 'package:micro_course/http/ResultCode.dart';import 'package:micro_course/http/GlobalConfig.dart';cl... Flutter(二)Android集成Flutter项目并实现跳转到 Flutter 界面 Flutter(三)Flutter与Android原生Activity交互及传递​​数据 Flutter(四)解决FlutterView显示黑屏卡顿问题 一 、Dio 简介 二、实战项装 1、定义API 2、DioUtil 3、Post请求 三、MD5参数加密 一 、Dio 简介 dio是一个Flutter网络请求... 在开发过程中,我们经常会用到网络请求,在flutter框架中,dio框架非常不错,所以今天的文章在dio的基础上搭建一套网络持久化框架,那么在flutter项目中如何搭建一套,高可用性,维护性较高的dio公共请求参数框架呢? 搭建前夕准备 一、基本认知 要持久化那么必然要有存储设备 持久化的数据在app启动后要即使填充到项目中 由于项目中网络请求地址繁多,类型不同,需要持久化的位置不同 二、基于基本认知来找合适的工具&必要点 2.1 持久化的工具: share_pre 在实际应用开发中,我们会有像 token、appVersionCode 等等这些每个接口请求都需要传的参数 ,称之为公共请求参数,公共请求参数配置方式总结有三: dio已经更新到4.0版本,相对已经很稳定了,不过为了通用性,如果直接应用在项目中,难免比较离散。一般项目开发都是多人共同协作,所以统一的规范,简洁的调用方式,稳定的性能是必不可少的,所以才有二次封装,方便实际项目中使用。 首先预览下文件结构: 一、整体设计描述 Api 对应项目中业务开发时候的调用接口 Code定义了常见请求状态,例如网络错误、超时、成功等 DataHelper定义了数据加密工具代码 DioLogInterceptor页面Loading拦截器,用于网络数据返回加工 dio是一个强大的Dart Http请求库,支持Restful API、FormData、拦截器、请求取消、Cookie管理、文件上传/下载、超时等… 我们的网络请求就是在dio的基础上封装的 . 所以要引入dio包. 添加依赖 dependencies: dio: ^x.x.x // 请使用pub上的最新版本 HttpUtil * Created by 李卓原 on ...
 作为系列文章的第二篇,继《Flutter完整开发实战详解(一、Dart语言和Flutter基础)》之后,本篇将为你着重展示:如何搭建一个通用的Flutter App 常用功能脚手架,快速开发一个完整的 Flutter 应用。  友情提示:本文所有代码均在 GSYGithubAppFlutter ,文中示例代码均可在其中找到,看完本篇相信你应该可以轻松完成如下效果。相关基础还请看篇章一。 class MyMy extends StatefulWidget { List<Widget> gedans = new List(); void getHttp() async { try { Response response; response =
文章目录使用Dio的配置默认配置通过options配置GET 请求POST请求多个并发请求:下载文件以流的方式接收响应数据:发送表单请求 FormData:通过FormData上传多个文件:监听发送(上传)数据进度:以流的形式提交二进制数据: 官方文档: https://github.com/flutterchina/dio/blob/master/README-ZH.md 由于flutter目...
Dio dio = new Dio(); Map<String, dynamic> headers = new Map(); headers['Cookie'] = cookie; Options options = new Options( headers:headers Future response; respo...
Flutter网络请求可以使用 http 包进行封装,也可以使用第三方库如 dio、retrofit 等进行封装。以下是使用 dio 进行网络请求封装的示例: 1. 引入 dio 包 在 pubspec.yaml 文件中引入 dio 包: ```dart dependencies: dio: ^4.0.0 然后运行 `flutter pub get` 安装依赖。 2. 创建网络请求工具类 ```dart import 'package:dio/dio.dart'; class HttpUtil { static const String baseUrl = "https://example.com/api/"; static Dio _dio; static Dio get dio { if (_dio == null) { _dio = Dio(BaseOptions( baseUrl: baseUrl, connectTimeout: 5000, receiveTimeout: 3000, return _dio; static Future<Response> get(String path, {Map<String, dynamic> params}) async { try { Response response = await dio.get(path, queryParameters: params); return response; } on DioError catch (e) { print(e.message); return null; static Future<Response> post(String path, {Map<String, dynamic> params}) async { try { Response response = await dio.post(path, data: params); return response; } on DioError catch (e) { print(e.message); return null; 3. 使用网络请求工具类 ```dart import 'package:flutter/material.dart'; import 'package:your_app/http_util.dart'; class MyPage extends StatefulWidget { @override _MyPageState createState() => _MyPageState(); class _MyPageState extends State<MyPage> { String _response = ""; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("My Page"), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ ElevatedButton( onPressed: () { _fetchData(); child: Text("Fetch Data"), SizedBox(height: 20), Text(_response), void _fetchData() async { Response response = await HttpUtil.get("users/1"); if (response != null) { setState(() { _response = response.data.toString(); 这个示例中,我们在 `HttpUtil` 类中封装了 `get` 和 `post` 请求,然后在 `MyPage` 页面中使用 `HttpUtil` 进行网络请求,并将获取到的数据显示在页面上。当然,你可以根据自己的需求进行更改和扩展。