




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
【移動應(yīng)用開發(fā)技術(shù)】使用Flutter怎么實現(xiàn)一個網(wǎng)絡(luò)請求
這期內(nèi)容當(dāng)中在下將會給大家?guī)碛嘘P(guān)使用Flutter怎么實現(xiàn)一個網(wǎng)絡(luò)請求,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。Flutter網(wǎng)絡(luò)請求使用的是Dio。Dio是一個強大易用的darthttp請求庫,支持RestfulAPI、FormData、攔截器、請求取消、Cookie管理、文件上傳/下載Flutterjson數(shù)據(jù)解析是使用了json_serializablepackage包。它是一個自動化源代碼生成器,可以為我們生成JSON序列化模板。由于序列化代碼不再由我們手寫和維護,我們將運行時產(chǎn)生JSON序列化異常的風(fēng)險降至最低。數(shù)據(jù)接口數(shù)據(jù)是使用的聚合數(shù)據(jù)的API,影訊API合集,大家可以注冊個賬號,申請使用一下,像這樣添加依賴在pubspec.yaml文件中添加所需要的第三方依賴庫
environment:
sdk:
">=2.1.0
<3.0.0"
dependencies:
flutter:
sdk:
flutter
json_annotation:
^2.0.0
connectivity:
^0.4.2
dio:
^2.0.15
event_bus:
^1.0.3
#
The
following
adds
the
Cupertino
Icons
font
to
your
application.
#
Use
with
the
CupertinoIcons
class
for
iOS
style
icons.
cupertino_icons:
^0.1.2
dev_dependencies:
flutter_test:
sdk:
flutter網(wǎng)絡(luò)請求過程分析
static
netFetch(url,params,Map<String,String>
header,Options
option,{noTip
=
false})
async
{
//獲取網(wǎng)絡(luò)的連接狀態(tài),如果沒有連接網(wǎng)絡(luò),返回NETWORK_ERROR
var
connectivityResult
=
await
(new
Connectivity().checkConnectivity());
if(connectivityResult
==
ConnectivityResult.none)
{
return
new
ResultData(Code.errorHandleFunction(Code.NETWORK_ERROR,
"",
noTip),false,Code.NETWORK_ERROR);
}
//請求頭存放集合
Map<String,String>
headers
=
new
HashMap();
if(header
!=
null)
{
headers.addAll(header);
}
//option存放請求的一些配置信息
if(option
!=
null)
{
option.headers
=
headers;
}else
{
//get請求
option
=
new
Options(method:'get');
option.headers
=
headers;
}
//超時時間15000ms
option.connectTimeout
=
15000;
//創(chuàng)建dio對象
Dio
dio
=
new
Dio();
Response
response;
try{
//執(zhí)行網(wǎng)絡(luò)請求,await和async配合使用,表示這是一個異步耗時操作
//執(zhí)行結(jié)果不會立馬返回。
response
=
await
dio.request(url,data:
params,options:
option);
}on
DioError
catch(e)
{
//異常處理
return
new
ResultData(Code.errorHandleFunction(errorResponse.statusCode,
e.message,
noTip),
false,
errorResponse.statusCode);
}
try{
if(response.statusCode
==
200
||
response.statusCode
==
201)
{
//網(wǎng)絡(luò)請求成功
return
await
new
ResultData(response.data,
true,
Code.SUCCESS,headers:
response.headers);
}
}catch(e)
{
//異常處理
print('返回參數(shù)'
+
e.toString()
+
url);
return
new
ResultData(response.data,
false,
response.statusCode,headers:
response.headers);
}
return
new
ResultData(Code.errorHandleFunction(response.statusCode,
"",
noTip),
false,
response.statusCode);
}這個是最底層類封裝了一個靜態(tài)的請求方法,直接調(diào)用dio的request方法進行網(wǎng)路請求,很簡單。
//如果這個是耗時方法,就會用async標(biāo)記,耗時操作用await標(biāo)記,表示是一個異步操作。
static
getTodayFilmListDao()
async
{
//獲取請求的url
String
url
=
Address.getTodayFilmList();
//調(diào)用上面封裝的網(wǎng)絡(luò)請求方法進行網(wǎng)絡(luò)請求
var
res
=
await
HttpMFetch(url,
null,
null,
null);
if(res
!=
null
&&
res.result)
{
var
data
=
res.data;
if(data
==
null
||
data.length
==
0)
{
return
await
new
DataResult([],true);
}
//網(wǎng)絡(luò)請求成功,進行數(shù)據(jù)解析
var
response
=
TodayFilmResponse.fromJson(data);
//返回數(shù)據(jù)
return
await
new
DataResult(response.result,true);
}else
{
return
await
new
DataResult(null,false);
}
}獲取url方法很簡單,就是字符串拼接了一下
static
getTodayFilmList()
{
return
"${host}movie/movies.today?cityid=1&dtype=&key=713a408e855352d913806ef1e3ce3c33";
}下面分析一下json數(shù)據(jù)解析過程。如上所說,json解析使用的是json_serializablepackage包。它是一個自動化源代碼生成器,可以為我們生成JSON序列化模板。網(wǎng)絡(luò)請求獲取到的json數(shù)據(jù)是這樣的{
"movieId":"135808",
"movieName":"新喜劇之王",
"pic_url":"http:\/\/\/mt\/2019\/02\/02\/113216.53857992_182X243X4.jpg"
},
TodayFilmBean類
//TodayFilmBean.g.dart將在我們運行生成命令之后自動生成
part
'TodayFilmBean.g.dart';
//這個標(biāo)注是告訴生成器,這個類是要生成的Model類
@JsonSerializable()
class
TodayFilmBean{
String
movieId;
String
movieName;
String
pic_url;
//構(gòu)造函數(shù)
TodayFilmBean(this.movieId,this.movieName,this.pic_url);
//json轉(zhuǎn)換為bean對象
factory
TodayFilmBean.fromJson(Map<String,dynamic>
json)
=>
_$todayFilmBeanFromJson(json);
//bean對象轉(zhuǎn)換為json
Map<String,dynamic>
toJson()
=>
_$todayFilmBeanToJson(this);
}
生成的TodayFilmBean.g.dart類是這樣的
part
of
'TodayFilmBean.dart';
//json轉(zhuǎn)換為bean對象
TodayFilmBean
_$todayFilmBeanFromJson(Map<String,dynamic>
json)
{
return
TodayFilmBean(json['movieId']
as
String,json['movieName']
as
String,
json['pic_url']
as
String);
}
//bean對象轉(zhuǎn)換為json
Map<String,dynamic>
_$todayFilmBeanToJson(TodayFilmBean
instance)
=>
<String,dynamic>
{
'movieId':
instance.movieId,
'movieName':
instance.movieName,
'pic_url':instance.pic_url
};有兩種運行代碼生成器的方法:1.一次性生成通過在我們的項目根目錄下運行flutterpackagespubrunbuild_runnerbuild,我們可以在需要時為我們的model生成json序列化代碼。這觸發(fā)了一次性構(gòu)建,它通過我們的源文件,挑選相關(guān)的并為它們生成必要的序列化代碼。雖然這非常方便,但如果我們不需要每次在model類中進行更改時都要手動運行構(gòu)建命令的話會更好。2.持續(xù)生成使用_watcher_可以使我們的源代碼生成的過程更加方便。它會監(jiān)視我們項目中文件的變化,并且在需要時自動構(gòu)建必要的文件。我們可以通過flutterpackagespubrunbuild_runnerwatch在項目根目錄下運行來啟動_watcher_。只需啟動一次觀察器,然后并讓它在后臺運行,這是安全的。執(zhí)行序列化只需執(zhí)行//把json數(shù)據(jù)轉(zhuǎn)化為了bean對象
var
filmBean
=
TodayFilmBean.fromJson(json);使用GridView最終展示結(jié)果
DataResult
dataResult;
List<TodayFilmBean>
mData
=
[];
//當(dāng)StatefulWiget被嵌入此view樹中,就會為此widget創(chuàng)建State對象
//當(dāng)State對象被創(chuàng)建了,frameWork就會調(diào)用initState()方法
@override
void
initState()
{
//初始化數(shù)據(jù)
getTodayFilm();
super.initState();
}
void
getTodayFilm()
async
{
//這是一個異步操作,結(jié)果返回有一定延遲
dataResult
=
await
TodayDao.getTodayFilmListDao();
//調(diào)用setState方法會通知framework控件狀態(tài)有變化,它會立馬觸發(fā)
//State的build方法更新widget狀態(tài)
setState(()
{
mData
=
dataResult.data;
});
}上面是初始化網(wǎng)絡(luò)請求,在請求到數(shù)據(jù)后,調(diào)用setState刷新UI
//State的build方法,調(diào)用setState方法后,此方法就會被觸發(fā)
//用來刷新UI
@override
Widget
build(BuildContext
context)
{
return
Scaffold(
appBar:
AppBar(
title:
Text(widget.title),
),
//如果mData.length
==
0,展示一個loading框,否則展示數(shù)據(jù)
body:
mData.length
==
0
?
new
Center(child:
new
CircularProgressIndicator()):
//創(chuàng)建GridView對象
new
GridView.builder(
gridDelegate:
SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount:
3,
//每行2個
mainAxisSpacing:
1.0,
//主軸(豎直)方向間距
crossAxisSpacing:
1.0,
//縱軸(水平)方向間距
childAspectRatio:
0.7
//縱軸縮放比例
),
//item數(shù)量
itemCount:mData.length,
//創(chuàng)建每個item
itemBuilder:
(BuildContext
context,int
index)
{
return
_getWidget(index);
}),
);
}
_getWidget(int
index)
{
//添加要展示的item內(nèi)容
return
new
Column(
children:
<Widget>[
new
Expanded(child:
new
CardItem(color:
Colors.black12,child:
_getChild(index)),flex:
8,),
//顯示網(wǎng)絡(luò)請求文本
new
Expanded(child:
new
Text(mData[index].movieName,
textAlign:
TextAlign.end,
maxLines:
1,
),
flex:1)
]);
}
_getChild(int
i)
{
return
new
Padding(padding:
new
EdgeInsets.all(1.0),
//顯示網(wǎng)絡(luò)請求的圖片
child:
new
Image(image:
NetworkImage(mData[i].pic_
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 濮陽科技職業(yè)學(xué)院《大數(shù)據(jù)統(tǒng)計模型實驗》2023-2024學(xué)年第二學(xué)期期末試卷
- 喀什大學(xué)《數(shù)字影像工程》2023-2024學(xué)年第二學(xué)期期末試卷
- 安徽工業(yè)經(jīng)濟職業(yè)技術(shù)學(xué)院《流行音樂經(jīng)典作品分析(2)》2023-2024學(xué)年第二學(xué)期期末試卷
- 公章的管理制度
- 公司章程中內(nèi)控的內(nèi)容
- 公共交通線路調(diào)整管理制度
- 工程施工隊每周進度計劃表格
- 頁巖磚砌體施工方案
- 【2025年二手房行業(yè)資訊:深圳周錄1812套再創(chuàng)新高】
- 江西省上饒市2024-2025學(xué)年高二上學(xué)期1月期末英語試題【含答案】
- GB/T 12618.4-2006開口型平圓頭抽芯鉚釘51級
- 紅金大氣商務(wù)風(fēng)領(lǐng)導(dǎo)歡迎會PPT通用模板
- 學(xué)前教育學(xué)00383-歷年真題-試卷
- 淡馬錫模式解讀匯總課件
- 2022年鄭州衛(wèi)生健康職業(yè)學(xué)院單招職業(yè)適應(yīng)性測試筆試試題及答案解析
- 穴位貼敷技術(shù)操作流程圖及評分標(biāo)準(zhǔn)
- 湖北省黃岡市基層診所醫(yī)療機構(gòu)衛(wèi)生院社區(qū)衛(wèi)生服務(wù)中心村衛(wèi)生室地址信息
- 個人有關(guān)事項報告表(全)
- 角膜上皮損傷-臨床診治專家共識-課件
- 電力排管檢驗批
- 畢業(yè)論文-樓道節(jié)能燈的設(shè)計與實現(xiàn)
評論
0/150
提交評論