一 卓箫、dio 簡介
dio 是一個國產(chǎn)巨佬寫的一個Flutter的網(wǎng)絡(luò)請求庫,寫這篇的文章的時候更新到3.x版本了蒂培。這里是他的 官方中文 使用鏈接:dio
按照原作者所說:
dio是一個強(qiáng)大的Dart Http請求庫搀缠,支持Restful API缰泡、FormData、攔截器弱左、請求取消窄陡、Cookie管理、文件上傳/下載拆火、超時跳夭、自定義適配器等...
二 、基本使用方法
- 添加依賴
dependencies:
dio: ^3.0.9 // 請使用pub上3.0.0分支的最新版本
我這里這個時候的是一個3.0.9版本们镜,這里的 ^
符號币叹,表示3.多的庫比如說3.1.1啥的,也能更新下來模狭。
- 基本使用
dio的原作者給了我們一個簡單的例子
import 'package:dio/dio.dart';
void getHttp() async {
try {
Response response = await Dio().get("http://www.****.com");
print(response);
} catch (e) {
print(e);
}
}
我們基礎(chǔ)的使用颈抚,請求一個URL,這里就直接是 Dio().get("http://www.****.com")
嚼鹉。這樣就可以通過get方式來請求我們的鏈接贩汉。
三 、項(xiàng)目實(shí)際使用方法
在我們項(xiàng)目中反砌,我們當(dāng)然不能直接使用 Dio().get("http://www.****.com")
這樣的方法雾鬼,那樣的話如果以后我們要更換網(wǎng)絡(luò)請求的庫的話萌朱,我們要修改的地方宴树,就會非常的多。類似的問題晶疼,曾經(jīng)在iOS開發(fā)的歷史上出現(xiàn)過一次酒贬。最初的時候iOS的開發(fā)者大多使用的是一個叫 ASI
的庫,但是在過了幾年的時候翠霍,這個庫不在維護(hù)了锭吨。這時候,我們就會去找一個新的網(wǎng)絡(luò)庫來代替他寒匙。當(dāng)時如果我們有500個文件中都直接使用 ASI
零如,我們就需要改動500個地方。這樣的體力和眼力消耗锄弱,實(shí)在是太驚人了考蕾。所以,我們一般會自己創(chuàng)建一個專門的 網(wǎng)絡(luò)管理
的類NetworkManager
会宪。在NetworkManager
里肖卧,我們把調(diào)用方法抽取出一個基礎(chǔ)的方法,使用的時候掸鹅,基于這個基礎(chǔ)的方法來調(diào)用塞帐。這樣拦赠,我們就能很方便的去進(jìn)去使用和維護(hù)。
- 創(chuàng)建一個基礎(chǔ)的文件http_request.dart文件
import 'package:dio/dio.dart';
const String BASEURL = "https://www.****.com";
class HTTPConfig {
static const baseURL = BASEURL;
static const timeout = 1000;
}
class LYHttpRequest {
static final BaseOptions options = BaseOptions(
baseUrl: HTTPConfig.baseURL, connectTimeout: HTTPConfig.timeout);
static final Dio dio = Dio(options);
static Future<T> request<T>(String url,
{String method = 'get', Map<String, dynamic> params, Interceptor inter}) async {
// 1.請求的單獨(dú)配置
final options = Options(method: method);
// 2.添加第一個攔截器
Interceptor dInter = InterceptorsWrapper(
onRequest: (RequestOptions options) {
// 1.在進(jìn)行任何網(wǎng)絡(luò)請求的時候, 可以添加一個loading顯示
// 2.很多頁面的訪問必須要求攜帶Token,那么就可以在這里判斷是有Token
// 3.對參數(shù)進(jìn)行一些處理,比如序列化處理等
print("攔截了請求");
return options;
},
onResponse: (Response response) {
print("攔截了響應(yīng)");
return response;
},
onError: (DioError error) {
print("攔截了錯誤");
return error;
}
);
List<Interceptor> inters = [dInter];
if (inter != null) {
inters.add(inter);
}
dio.interceptors.addAll(inters);
// 3.發(fā)送網(wǎng)絡(luò)請求
try {
Response response = await dio.request<T>(url, queryParameters: params, options: options);
return response.data;
} on DioError catch(e) {
return Future.error(e);
}
}
}
- 創(chuàng)建一個主頁homepage使用的home_request.dart文件
import 'network_manager.dart';
class HomeRequest {
static requestMovieList(int start) async {
// 1.構(gòu)建URL
final movieURL = "https://douban.uieee.com/v2/movie/top250?start=$start&count=20}";
// 2.發(fā)送網(wǎng)絡(luò)請求獲取結(jié)果
final result = await LYHttpRequest.request(movieURL);
print("result is $result");
}
}
這個時候我們就可以使用我們創(chuàng)建的類來直接調(diào)用我們的方法了葵姥。
- 使用
在主頁荷鼠,我們搞一個按鈕,點(diǎn)擊這個按鈕榔幸,我們就請求我們的方法
class LYHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("hello 大眠獸"),
),
body: Center(
child: RaisedButton(
child: Text("請求數(shù)據(jù)"),
onPressed: () {
HomeRequest.requestMovieList(0);
}
),
)
);
}
}
這樣颊咬,我們的dio的初步使用就完成了。下一篇文章來寫dio的進(jìn)階使用牡辽。