flutter项目总结二(网络请求)

由于水平有限,网上有很多看起来封装很好的例子,有一些代码没有看明白使用场合,先简单封装了一下,在自己项目中用着舒服就行了,毕竟这个封装需要考虑后端的一些实现方式,先看下封装的代码:

/*
 * 作者:shangjunfei
 * 上次修改时间:2019年10月11日 16:36:54
 * Copyright(c) 2019
 */

import 'dart:convert';

import 'package:dio/dio.dart';
import 'package:cookie_jar/cookie_jar.dart';
import 'package:flutter/material.dart';
import 'package:oktoast/oktoast.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:wxiot/config/Config.dart';
import 'package:wxiot/mainpage/loginPage.dart';
import 'package:wxiot/model/UserInfo.dart';

//简单单例封装
class HttpDio {
  Dio dio;
  static HttpDio _instance;

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

  HttpDio() {
    BaseOptions options = BaseOptions();
    options.connectTimeout = 10 * 1000;
    options.receiveTimeout = 20 * 1000;
    dio = new Dio();
    dio.options = options;
    dio.interceptors.add(CookieManager(CookieJar())); //支持cookie
  }

  ///get请求简单封装,后面再优化,为了不重复很多代码
  get(url, data, context, callback) async {
    try {
      Response response = data != null
          ? await dio.get(url, queryParameters: data)
          : await dio.get(
              url,
            );
      callback(response);
    } on DioError catch (e) {
      print(e); //TODO:发布时屏蔽
      if (e.response?.statusCode == 401) {
        showToast("凭证过期,重新登录中。。。", duration: Duration(seconds: 3));
        relogin(context);
        Navigator.pop(context, "relogin");
      } else {
        showToast("出错了,请联系管理员", duration: Duration(seconds: 3));
      }
    } catch (exception) {
      print(exception); //TODO:发布时屏蔽
      showToast("出错了,请联系管理员", duration: Duration(seconds: 3));
    }
  }

  ///post请求简单封装,后面再优化
  post(url, data, context, callback) async {
    try {
      Response response = await dio.post(url, data: data);
      callback(response);
    } on DioError catch (e) {
      if (e.response.statusCode == 401) {
        relogin(context);
        showToast("凭证过期,重新登录中。。。", duration: Duration(seconds: 3));
        Navigator.pop(context, "relogin");
      } else {
        showToast("出错了,请联系管理员", duration: Duration(seconds: 3));
      }
    } catch (exception) {
      showToast("出错了,请联系管理员", duration: Duration(seconds: 3));
    }
  }

//登录
  login(url, data, context, callback) async {
    try {
      Response response = await dio.post(url, data: data);
//      print(response.toString());
      callback(response);
    } on DioError catch (e) {
      Scaffold.of(context).showSnackBar(SnackBar(
        content: Text('出错了,请联系管理员'),
        duration: Duration(seconds: 2),
      ));
    } catch (exception) {
      Scaffold.of(context).showSnackBar(SnackBar(
        content: Text('出错了,请联系管理员'),
        duration: Duration(seconds: 2),
      ));
    }
  }

}

除了常用的get和post方法,单独封装了一下login接口,是因为该项目采用了cookie,有的时候会超时,需要后台刷新一下登录信息,登录的处理逻辑略有不同。

下面是具体使用的栗子代码:

  _showDetail(String devId) async {
    LoadingPage loadingPage = new LoadingPage(context);
    loadingPage.show();
    var url = Config.getDeviceInfoUrl;
    var formData = {
      "dev_id": devId,
    };
    HttpDio.getInstance().get(url, formData, context, (response) {
      if (response.data['code'] == 1) {
        var res = jsonDecode(response.toString());
        var data = res['data'];
        DeviceInfo deviceInfo = DeviceInfo(data['deviceInfo']);
        loadingPage.close();
        DeviceDetailFactory deviceDetailFactory =
            new DeviceDetailFactory(context, deviceInfo);
        deviceDetailFactory.showDetail();
      } else {
        showToast(response.data['msg'], duration: Duration(seconds: 3));
      }
    });
  }

基本一目了然,不用多做解释,顺便吐槽一下csdn的代码编辑,居然没有dart语言可选,呵呵。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尚俊飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值