flutter Dio封装

dio官方文档地址,介绍使用很全,Cookie、Log、Interceptor等。而且迭代很快,要时刻关注着,有一些新的适合自己项目的调整,随时加进来。点击传送)

整理的flutter的各类组件的使用demo,一起学习
https://github.com/ZHBoy/FlutterProject01

DioManager网络请求主类

import 'package:dio/dio.dart';
import 'dart:convert';
import 'package:cookie_jar/cookie_jar.dart';
import 'package:dio_cookie_manager/dio_cookie_manager.dart';
import '../base/GlobalConfig.dart';
import 'ResultCode.dart';

/*
 * 网络请求管理类
 */
class DioManager {
  //写一个单例
  //在 Dart 里,带下划线开头的变量是私有变量
  static DioManager _instance;

  static DioManager getInstance() {
    if (_instance == null) {
      _instance = DioManager();
    }
    return _instance;
  }

  Dio dio = new Dio();
  DioManager() {
    // Set default configs
    dio.options.headers = {
      "version": '2.0.9',
    };
    dio.options.baseUrl = "https://cadfen-test.ym.net";
    dio.options.connectTimeout = 5000;
    dio.options.receiveTimeout = 3000;

    dio.interceptors
        .add(LogInterceptor(responseBody: GlobalConfig.isDebug)); //是否开启请求日志
    dio.interceptors.add(CookieManager(CookieJar())); //缓存相关类
  }

  //get请求
  get(String url, Map params, Function successCallBack,
      Function errorCallBack) async {
    _requstHttp(url, successCallBack, 'get', params, errorCallBack);
  }

  //post请求
  post(String url, params, Function successCallBack,
      Function errorCallBack) async {
    _requstHttp(url, successCallBack, "post", params, errorCallBack);
  }

  _requstHttp(String url, Function successCallBack,
      [String method, params, Function errorCallBack]) async {
    Response response;
    try {
      if (method == 'get') {
        if (params != null && params.length > 0) {
          response = await dio.get(url, queryParameters: params);
        } else {
          response = await dio.get(url);
        }
      } else if (method == 'post') {
        if (params != null && params.length > 0) {
          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);
    }
  }

  _error(Function errorCallBack, String error) {
    if (errorCallBack != null) {
      errorCallBack(error);
    }
  }
}

dio网络请求失败的回调错误码

/*
 * dio网络请求失败的回调错误码 
 */
class ResultCode {

  //正常返回是1
  static const SUCCESS = 1;
  
  //异常返回是0
  static const ERROR = 0;
  
  /// When opening  url timeout, it occurs.
  static const CONNECT_TIMEOUT = -1;

  ///It occurs when receiving timeout.
  static const RECEIVE_TIMEOUT = -2;

  /// When the server response, but with a incorrect status, such as 404, 503...
  static const RESPONSE = -3;
  /// When the request is cancelled, dio will throw a error with this type.
  static const CANCEL = -4;

  /// read the DioError.error if it is not null.
  static const DEFAULT = -5;
}

工程配置文件,用于设置debug开关、日夜模式切换、默认字体等等

import 'package:flutter/material.dart';

/*
 *系统主题设置,包括系统默认字体 背景色等
 */
class GlobalConfig {
  static bool isDebug = true;//是否是调试模式
  static bool dark = false;
  static Color fontColor = Colors.black54;
}

**网络请求使用示例 **

 import 'package:demo001/data/HotSaleBean.dart';
import 'package:demo001/data/OnlyDataBean.dart';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import '../widgets/BaseThemeBar.dart';
import '../dio/DioManager.dart';

/*
 * 网络Dio库的使用
 */
class NetDioSimpleDemoPage extends StatefulWidget {
  @override
  _NetDioSimpleDemoPageState createState() => _NetDioSimpleDemoPageState();
}

class _NetDioSimpleDemoPageState extends State<NetDioSimpleDemoPage> {
  var _items = []; //热卖实体类
  OnlyDataBean onlyDataBean; //更新热卖商品返回bean

  /*
    测试get请求
    可以将baseUrl和接口地址换成自己的测试
   */
  void _testGet() async {
    DioManager.getInstance()
        .get('/calendar/otherFunction/getOnlineSpecialGoods', {},
            //正常回调
            (data) {
      setState(() {
        //更新UI等
        this._items.clear();
        this._items.addAll(HotSaleBean.fromJson(data).data);
        _showToast("获取热卖商品成功");
      });
    },
            //错误回调
            (error) {
      print("网络异常,请稍后重试");
    });
  }

  /*
  * 测试post请求
  可以将baseUrl和接口地址换成自己的测试
  */
  void _testPost() async {
    DioManager.getInstance().post(
        '/calendar/otherFunction/modifySpecialGoodsByParam',
        FormData.fromMap({
          "id": "1",
          "title": "换妆品",
          "contentDesc": "换妆品",
          "landingPage": "https://s.click.taobao.com/YlCLjtu"
        }),
        //正常回调
        (data) {
      setState(() {
        //更新UI等
        setState(() {
          onlyDataBean = OnlyDataBean.fromJson(data);
          _showToast("修改热卖商品成功,重新获取查看");
        });
      });
    },
        //错误回调
        (error) {
      print("网络异常,请稍后重试");
    });
  }

  /*
  * toast提示
  */
  _showToast(String s) {
    Fluttertoast.showToast(
        msg: s,
        gravity: ToastGravity.CENTER,
        backgroundColor: Colors.grey,
        fontSize: 16,
        toastLength: Toast.LENGTH_SHORT,
        textColor: Colors.white);
  }

  /*
   * 热卖商品列表
   */
  Widget _getListData(context, index) {
    return ListTile(
      title: Text(this._items[index].title),
      subtitle: Text(this._items[index].contentDesc),
    );
  }

  @override
  void initState() {
    super.initState();
    // _testGet();
    // _testPost();
  }

  @override
  Widget build(BuildContext context) {
    return getBaseThemeBar(
        '测试使用dio网路库',
        Padding(
          padding: EdgeInsets.all(10.0),
          child: Column(
            children: [
              RaisedButton(
                  child: Text('修改热卖商品'),
                  onPressed: () {
                    setState(() {
                      _testPost();
                    });
                  }),
              RaisedButton(
                  child: Text('获取热卖商品'),
                  onPressed: () {
                    setState(() {
                      _testGet();
                    });
                  }),
              Expanded(
                  child: ListView.builder(
                      itemBuilder: _getListData, itemCount: this._items.length))
            ],
          ),
        ));
  }
}

demo中使用的三方库

  #flutter中的提示
  fluttertoast: ^7.1.5
  #网络库-dio
  dio: 3.0.10
  #网络库-cookie
  cookie_jar: ^1.0.0
  #网络库-cookieManager
  dio_cookie_manager: 1.0.0
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,194评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,058评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,780评论 0 346
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,388评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,430评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,764评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,907评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,679评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,122评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,459评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,605评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,270评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,867评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,734评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,961评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,297评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,472评论 2 348

推荐阅读更多精彩内容