首先引入dio庫

dio: 2.1.0

編寫dio工具类

import 'dart:io';
import 'dart:math';

import 'package:cookie_jar/cookie_jar.dart';
import 'package:dio/dio.dart';
import 'package:flutter/services.dart';
import 'dart:convert';



class HttpUtil {
  static HttpUtil instance;
  Dio dio;
  BaseOptions options;

  CancelToken cancelToken = new CancelToken();

//单例模式
  static HttpUtil getInstance() {
    if (null == instance) {
      instance = new HttpUtil();
    } else {
      return instance;
    }
  }

  /*
   * config it and create
   */
  HttpUtil() {
    //BaseOptions、Options、RequestOptions 都可以配置参数,优先级别依次递增,且可以根据优先级别覆盖参数
    options = new BaseOptions(
      //请求基地址,可以包含子路径
      baseUrl: "http://47.100.106.80:8080/",
      //连接服务器超时时间,单位是毫秒.
      connectTimeout: 10000,
      //响应流上前后两次接受到数据的间隔,单位为毫秒。
      receiveTimeout: 5000,
      //Http请求头.
      headers: {
        //do something
//        "version": "1.0.0"
      },
      //请求的Content-Type,默认值是[ContentType.json]. 也可以用ContentType.parse("application/x-www-form-urlencoded")
      contentType: ContentType.json,
      //表示期望以那种格式(方式)接受响应数据。接受4种类型 `json`, `stream`, `plain`, `bytes`. 默认值是 `json`,
      responseType: ResponseType.plain,
    );

    dio = new Dio(options);

    //跳过https验证
    (dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate =
        (client) {
      client.badCertificateCallback =
          (X509Certificate cert, String host, int port) {
        return true;
      };
    };

    //Cookie管理
    dio.interceptors.add(CookieManager(CookieJar()));

    //添加拦截器
    dio.interceptors
        .add(InterceptorsWrapper(onRequest: (RequestOptions options) {
      print("请求之前");
      options.headers={
      };
      options.contentType=ContentType.parse("application/json");
      return options; //continue
    }, onResponse: (Response response) {
      print("响应之前");
      // Do something with response data
      return response; // continue
    }, onError: (DioError e) {
      print("错误之前");
      // Do something with response error
      return e; //continue
    }));
  }

  /*
   * get请求
   * url:请求地址
   * data:请求参数
   * options:请求配置
    * cancelToken:取消标识
   */

  get(url, {params, options, cancelToken}) async {
    Response response;
    try {
      response = await dio.get(url,
          queryParameters: params, options: options, cancelToken: cancelToken);

      print('get success---------${response.data}');
    } on DioError catch (e) {
      print('get error---------$e');
      formatError(e);
    }
    return response.data;
  }

  /*
   * post请求
   */
  post(url, {params, options, cancelToken}) async {
    Options op = new Options(contentType: ContentType.parse("application/json"));
    Response response;
    try {
      response = await dio.post(url,
          queryParameters: params, options: op, cancelToken: cancelToken);
      print('post success---------${response.data}');
    } on DioError catch (e) {
      print('post error---------$e' + e.message);
      formatError(e);
    }
    return response.data;
  }

  /// 发送json
  postJson(url, Map<String, dynamic> queryParameters) async {
    Options op =
    new Options(contentType: ContentType.parse("application/json"));

    Response response;
    try {
      response = await dio.post(url,
          data: queryParameters, options: op, cancelToken: cancelToken);
      print('post success---------${response.data}');
    } on DioError catch (e) {
      print('post error---------$e' + e.message);
      formatError(e);
    }
    return response.data;
  }

  /*
   * 下载文件
   */
  downloadFile(urlPath, savePath) async {
    Response response;
    try {
      response = await dio.download(urlPath, savePath,
          onReceiveProgress: (int count, int total) {
            //进度
            print("$count $total");
          });
      print('downloadFile success---------${response.data}');
    } on DioError catch (e) {
      print('downloadFile error---------$e');
      formatError(e);
    }
    return response.data;
  }

  /*
   * error统一处理
   */
  void formatError(DioError e) {
    if (e.type == DioErrorType.CONNECT_TIMEOUT) {
      // It occurs when url is opened timeout.
      print("连接超时");
    } else if (e.type == DioErrorType.SEND_TIMEOUT) {
      // It occurs when url is sent timeout.
      print("请求超时");
    } else if (e.type == DioErrorType.RECEIVE_TIMEOUT) {
      //It occurs when receiving timeout
      print("响应超时");
    } else if (e.type == DioErrorType.RESPONSE) {
      // When the server response, but with a incorrect status, such as 404, 503...
      print("出现异常");
    } else if (e.type == DioErrorType.CANCEL) {
      // When the request is cancelled, dio will throw a error with this type.
      print("请求取消");
    } else {
      //DEFAULT Default error type, Some other Error. In this case, you can read the DioError.error if it is not null.
      print("未知错误");
    }
  }

  /*
   * 取消请求
   * 同一个cancel token 可以用于多个请求,当一个cancel token取消时,所有使用该cancel token的请求都会被取消。
   * 所以参数可选
   */
  void cancelRequests(CancelToken token) {
    token.cancel("cancelled");
  }
}

雖然只是做一個列表顯示,根本不用寫這麼多,不過以後如果完善功能可以用到

import 'dart:convert';

import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:flutter_dio/DAL/SqlfliteManager.dart';
import 'package:flutter_dio/list_bean_entity.dart';

import 'package:flutter_dio/HttpUtil.dart';

class DioPage extends StatefulWidget {
  @override
  _DioPageState createState() => _DioPageState();
}

class _DioPageState extends State<DioPage> {


  List<ListBeanData>_listData=[];

//  查詢全部數據
  Future<Null>_getSymptom()async{
    Map<String,String>paras={};
    var data;
    data=await HttpUtil().get("hr/all");
    var resoMap=json.decode(data.toString());
    ListBeanEntity listBeanEntity=ListBeanEntity.fromJson(resoMap);
    _listData=listBeanEntity.data;
    setState(() {
    });
  }


  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    _getSymptom();
  }
  //构造listtile
  Widget _buildRow(int index) {
    return Padding(
      padding: EdgeInsets.all(20.0),
      child: Column(
        children: <Widget>[
          Text(
            _listData[index].account,
            style: TextStyle(color: Colors.black87, fontSize: 20),
          ),
          Text(
            _listData[index].info,
            style: TextStyle(color: Colors.grey, fontSize: 18),
          ),
          RaisedButton(
            onPressed: (){
              String id=_listData[index].id.toString();

            },
            child: Text("刪除"),
          )
        ],
      ),
    );
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("DiO網絡請求"),
      ),
      body: ListView.separated(
        itemCount: _listData.length,
        itemBuilder: (BuildContext context, int index) => _buildRow(index),
        //子项的分割线
        separatorBuilder: (BuildContext context, int index) => Divider(),
      ),
    );
  }
}
01-11 10:40