前言
在开发中避免不了从服务器获取数据,在写网络请求时,我们通常会使用一些第三方库来更优雅的解决问题,例如iOS中的AFNetworking,Android中的OKHttp。在Flutter中网络请求,我使用到的是dio,GitHub地址。这是由Flutter中文网开发的一个开源网络请求库。
实践
由于dio相较之前有较大改动,所以删除了之前的封装方法
集成dio,在pubspec.yaml文件中添加dio(注意格式):
dependencies:
flutter:
sdk: flutter
dio: ^3.0.9
封装思路:
对于网络请求,我们一般都需要配置baseUrl、超时时间等,我采用的时候单例方法创建dio,在main.dart文件中,直接进行一次配置即可。配置方法如下:
void main() {
return runApp(MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
httpManager.baseUrl = Config.baseUrl;
return MaterialApp(
title: 'demo',
theme: ThemeData(
primarySwatch: Colors.white,
),
home: HomePage());
}
}
final HttpManager httpManager = HttpManager.instance;
在调用网络请求时,一般只关注以下几点:
- 接口地址
- 请求方法
- 参数
- 参数位置(url或者body中)
- 请求头
针对以上关注内容,在封装的时候,我创建了一个TargetType来对这些数据进行配置,代码如下:
enum MSNetServiceMethod {
POST,
GET,
PATCH,
DELETE,
UPLOAD,
DOWNLOAD,
}
enum ParameterEncoding {
/// 参数放在URL中
URLEncoding,
/// 参数放在body中
BodyEncoding
}
class TargetType {
/// 接口地址
String path;
/// 请求方法
MSNetServiceMethod method;
/// 参数
Object parameters;
/// 参数放置位置(仅有参数时 需要传)
ParameterEncoding encoding;
/// 请求头
Map headers;
config(
{String path,
MSNetServiceMethod method = MSNetServiceMethod.GET,
Object parameters,
ParameterEncoding encoding,
Map headers}) {
this.path = path;
this.method = method;
if (parameters != null) {
this.parameters = parameters;
this.encoding = encoding;
}
if (headers != null) {
this.headers = headers;
}
return this;
}
}
请求完成时,一般只关注:
- 请求是否成功
- 返回数据
针对以上关注内容,我创建了一个ValidateResult,来对返回数据进行封装,代码如下:
enum ValidateType{
/// 请求中
validating,
/// 请求成功
success,
/// 请求失败
failed,
}
class ValidateResult {
ValidateType validateType;
var data;
var errorMsg;
ValidateResult(this.validateType,{
this.data,
this.errorMsg});
}
ValidateType中的validating(请求中),一般在页面上显示ProgressHUD时会使用到。
其它内容:
处理完以上关注的内容,剩下的就是具体的网络请求过程,及数据处理方式,具体参考HttpManager.dart文件。
使用方法:
简单的说明一下使用方法,具体还是参考demo。
- 创建一个Api.dart文件(你也可以创建多个),统一处理接口:
class Api {
static apiDemo({String phone}) {
return TargetType().config(
path: // 接口地址,
method: // 请求方法,
parameters: // 参数,
encoding: // 参数位置(有参数时需要传)
headers: // 请求头(需要时传)
);
}
}
注: parameters为Object类型,意味上传的参数是允许的任何类型,但是均需在此做处理。但如果参数放在url中,parameters类型仅能Map<String, dynamic>
- 调用:
getDemoApi() async {
ValidateResult result = await HttpManager.instance.request(Api.apiDemo());
switch (result.validateType) {
case ValidateType.validating:
break;
case ValidateType.success:
break;
case ValidateType.failed:
break;
}
}
注:此处的validating没什么用,不需要处理,只需要处理success和failed两种状态即可。
GitHub地址:
https://github.com/Mystical-Fan/MSNetService