logo头像

aferica

Flutter学习(三):网络请求Dio模块使用

本文于1679天之前发表,文中内容可能已经过时。

当我们使用或者制作一个APP时,数据请求验证无疑是最为关键的部分。
Flutter自身带有Http模块以用于数据请求,但是过于简单,通常不能满足我们的需求。

简介

dio是一个强大的Dart Http请求库,支持Restful API、FormData、拦截器、请求取消、Cookie管理、文件上传/下载、超时、自定义适配器等…
官方Github地址
中文文档
文档比较详细,我就不重复了,下面我主要介绍基本封装

使用封装

Get请求是使用最为频繁的请求方式,我们以Get为例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import 'package:flutter/material.dart';
import 'dart:convert';
import 'dart:async';
// 使用fluttertoast来处理一些报错的toast提示信息
import 'package:fluttertoast/fluttertoast.dart';
import 'package:dio/dio.dart';
// 使用shared_preferences来保存登录状态
import 'package:shared_preferences/shared_preferences.dart';

// 初始化
final Dio dio = new Dio();

class Request {

static Future<Map<String, dynamic>> get(String url, { Map<String, String> params }) async {
print(url);
Map<String, dynamic> result = new Map();
// shared_preferences初始化
SharedPreferences prefs = await SharedPreferences.getInstance();
// 获取本地保存的token(用于身份验证)
// 如果不存在就返回''
String token = prefs.getString('token') ?? '';
if(token == '') {
// 未登录 返回
Fluttertoast.showToast(msg: '请登录后使用', backgroundColor: Colors.black54, fontSize: 14.0);
} else {
try {
Response res = await dio.get(
url,
queryParameters: params,
options: new Options(
// 返回字符串
// 由于Dart不能像JS一样直接使用JSON,需要转换为Map对象
// 所以对于返回值为JSON格式数据的接口推荐返回String
// 以便于接下来使用`dart:convert`将String转为Map
responseType: ResponseType.plain,
// JWT接口验证 吐过不需要可省略
headers: { 'Authorization': 'Bearer ' + token }
)
);

String tempRes = res.toString();
// 如果返回数据是JSON数据
// 例如`[{"":""},{"":""},{"":""}]`
// 需要使用`{}`处理后才可以转为Map
if(tempRes[0] == '[') {
tempRes = '{"reslut":' + tempRes + '}';
}
result = json.decode(tempRes.toString());
} catch (e) {
// 网络异常统一处理
result = null;
Fluttertoast.showToast(msg: '网络请求错误,请重试', backgroundColor: Colors.black54, fontSize: 14.0);
}
// 如果接口数据格式相同,如使用ok字段返回请求是否成功
// 可添加 数据统一处理
// if (!result['ok']) {
// Fluttertoast.showToast(msg: result['msg'], backgroundColor: Colors.black54, fontSize: 14.0);
// result = null;
// }
// }

return result;
}
}
微信打赏

你的赞赏是对我最大的鼓励