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語言可選,呵呵。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章