本文已参与好文召集令活动,点击查看:后端、大前端双赛道投稿,2万元奖池等你挑战!」前端
有这么一个纯属虚构的故事,说小王在成为老王以前,为人处事很谨慎。譬如说,他有了女友,他呢又想让别人知道本身有女友了,可是又不想让别人知道本身的女友是谁。很矛盾是吧?这就是小王的谨慎之处,万一哪天换女友了(说不定换得还挺勤快),不至于被人嘲笑乱来,或者被人称为“渣男”。git
怎么办呢?小王究竟是学过历史的人,想起了汉武帝刘彻年少时候的“金屋藏娇”的故事,因而就重演了这个历史。程序员
小王的女朋友年轻漂亮,起了个英文名字叫“Dio”,听说是 pub 上的交际花,你们基本上相互联络都靠她。小王很低调,不想让别人知道她的女朋友是 Dio,因而对外只说本身有女友,而且对外宣称这个女友叫作 HttpUtil。目前HttpUtil其实就是披了外衣的 Dio,可是哪天小王换成别的女朋友了,别人也看不出来——由于从外面看,都是叫 HttpUtil。小王暗地里称之为:Dio 之金屋藏娇。后端
小王利用HttpUtil向外面展现了 Dio 的交际能力,譬如Get
、Put
、Post
、Patch
、Delete
和 Upload
。这样小王颇有面子,由于你们都以为小王的女友很厉害——虽然没有见过面。不少年之后,小王变成老王后,老王的儿子雇佣了一批程序员,才知道程序员早就发明了这种技巧,还取了个专门的术语,叫作封装。api
最开始的时候,小王的HttpUtil
长这样。可是发现介绍女友的每个交际能力都得吧啦吧啦讲一堆如何处理交际过程的尴尬场面(异常),也太麻烦了!markdown
class HttpUtil {
static Dio _dioInstance;
static Dio getDioInstance() {
if (_dioInstance == null) {
_dioInstance = Dio();
}
return _dioInstance;
}
static Future get(String url, {Map<String, dynamic> queryParams}) async {
try{
return await HttpUtil.getDioInstance().get(url, queryParameters: queryParams);
} on DioError catch (e) {
EasyLoading.showError(e.message);
} on Exception catch (e) {
EasyLoading.showError(e.toString());
}
}
//...
}
复制代码
小王省事,作了一次改进,把全部的能力都经过另外一个方式一块儿讲,这样讲的时候把所有技能都一遍的时候,只须要介绍一次如何处理尴尬场面就行了,毕竟尴尬场面的处理都是差很少的。首先,小王如数家珍似的定义了女友的能力。网络
enum HttpMethod {
GET,
PUT,
POST,
PATCH,
DELETE,
UPLOAD,
}
复制代码
接着,定义了他介绍女友的话术:异步
static Future sendRequest(HttpMethod method, String url,
{Map<String, dynamic> queryParams, dynamic data}) async {
try {
switch (method) {
case HttpMethod.GET:
return await HttpUtil.getDioInstance()
.get(url, queryParameters: queryParams);
case HttpMethod.PUT:
return await HttpUtil.getDioInstance()
.put(url, queryParameters: queryParams, data: data);
case HttpMethod.POST:
return await HttpUtil.getDioInstance()
.post(url, queryParameters: queryParams, data: data);
case HttpMethod.PATCH:
return await HttpUtil.getDioInstance()
.patch(url, queryParameters: queryParams, data: data);
case HttpMethod.DELETE:
return await HttpUtil.getDioInstance()
.delete(url, queryParameters: queryParams, data: data);
default:
EasyLoading.showError('请求方式错误');
}
} on DioError catch (e) {
EasyLoading.showError(e.message);
} on Exception catch (e) {
EasyLoading.showError(e.toString());
}
return null;
}
复制代码
这个时候,再来介绍某一项能力就轻松多了。async
static Future get(String url, {Map<String, dynamic> queryParams}) async {
return await sendRequest(HttpMethod.GET, url, queryParams: queryParams);
}
static Future put(String url,
{Map<String, dynamic> queryParams, dynamic data}) async {
return await sendRequest(HttpMethod.PUT, url,
queryParams: queryParams, data: data);
}
static Future post(String url,
{Map<String, dynamic> queryParams, dynamic data}) async {
return await sendRequest(HttpMethod.POST, url,
queryParams: queryParams, data: data);
}
static Future patch(String url,
{Map<String, dynamic> queryParams, dynamic data}) async {
return await sendRequest(HttpMethod.PATCH, url,
queryParams: queryParams, data: data);
}
static Future delete(String url,
{Map<String, dynamic> queryParams, dynamic data}) async {
return await sendRequest(HttpMethod.DELETE, url,
queryParams: queryParams, data: data);
}
static Future uploadSingle(String url, String fileKey, File file,
{Map<String, dynamic> queryParams}) async {
FormData formData = FormData.fromMap({
fileKey: await MultipartFile.fromFile(file.path),
});
return await sendRequest(HttpMethod.POST, url,
queryParams: queryParams, data: formData);
}
复制代码
一切就绪,小王开始切断了女友 Dio 与外界的联系,今后外面的世界的人只知道小王有个女友,代号叫 HttpUtil
,至于究竟是谁,长得怎么样,全靠小王的一张嘴了!好比DynamicService
这位同窗:oop
import '../utils/http_util.dart';
class DynamicService {
static String host = 'http://localhost:3900/api/';
static Future list(page, pageSize) async {
var result = await HttpUtil.get(
host + 'dynamics',
queryParams: {'page': page, 'pageSize': pageSize},
);
return result;
}
static Future get(String id) async {
var result = await HttpUtil.get(
host + 'dynamics/' + id,
);
return result;
}
static Future post(Map<String, dynamic> data) async {
var result = await HttpUtil.post(host + 'dynamics', data: data);
return result;
}
static Future updateAll(String id, Map<String, dynamic> data) async {
var result = await HttpUtil.put(host + 'dynamics/' + id, data: data);
return result;
}
static Future update(String id, Map<String, dynamic> data) async {
var result = await HttpUtil.patch(host + 'dynamics/' + id, data: data);
return result;
}
static Future updateViewCount(String id) async {
var result = await HttpUtil.patch(host + 'dynamics/view/' + id);
return result;
}
static Future delete(String id) async {
var result = await HttpUtil.delete(
host + 'dynamics/' + id,
);
return result;
}
}
复制代码
再好比 DynamicAdd
这位同窗:
//...
var response = await DynamicService.post(newFormData);
if (response != null && response.statusCode == 200) {
Dialogs.showInfo(context, '添加成功');
GetIt.instance
.get<DynamicListener>()
.dynamicAdded(DynamicEntity.fromJson(response.data));
Navigator.of(context).pop();
} else {
Dialogs.showInfo(this.context,
response?.statusMessage != null ? response.statusMessage : '添加失败');
}
//...
复制代码
小王给外面人的形象是愈发神秘了,你们都想见见小王的能干女朋友,但是每次小王讲的都是 HttpUtil
,而他本身呢也很满意本身的这个“金屋藏娇”的主意,直到有一天他成为老王后,他家的儿子——新的小王给他捅了篓子。
——未完待续
源码已上传至Dio 封装源代码