先在pubspec.yaml中引入Dio包如圖所示
- 認識Dio庫:dio是一個dart的 http請求通用庫,目前也是大陸使用最廣泛的庫,國人開發,完全開源。
- flutter的插件包管理:學了引入dio包,並簡單的學習了
pubspec.yaml
的結構和編寫注意事項。 - get請求的編寫:我們以一個充滿正能量的小Demo講述了get請求的實現,並成功的返回了結果。
Get請求和POST請求都是在工作中最重要的兩種請求。一般GET請求用於獲取數據,POST請求用於提交數據。
在dart文件中寫入代碼:
import 'package:flutter/material.dart'; import 'package:dio/dio.dart'; class TabsPage extends StatelessWidget { @override Widget build(BuildContext context) { getHttp(); return Scaffold( body: Center( child: Text('首頁'), ), ); } void getHttp() async { try{ Response response = await Dio().get( 'https://jsonplaceholder.typicode.com/photos' ); return print(response); }catch(e){ return print(e); } } }
運行后輸出結果如圖所示
Get請求和動態組件協作
示例的具體業務邏輯是這樣的:
- 我們制作一個文本框,用於輸入需要什么樣的美女為我們服務
- 然后點擊按鈕,相當於去后端請求數據
- 后端返回數據后,根據你的需要美女就會走進房間
生成動態組件
可以使用stful
的快捷方式,在VSCode
里快速生成StatefulWidget
的基本結構,我們只需要改一下類的名字就可以了,就會得到如下代碼
class HomePage extends StatefulWidget { _HomePageState createState() => _HomePageState(); } class _HomePageState extends State<HomePage> { @override Widget build(BuildContext context) { return Container( child: child, ); } }
有了動態組件,咱們先把界面布局作一下。
@override Widget build(BuildContext context) { return Container( child: Scaffold( appBar: AppBar(title: Text('美好人間'),), body:Container( child: Column( children: <Widget>[ TextField( //文本框 controller:typeController, decoration:InputDecoration ( contentPadding: EdgeInsets.all(10.0), labelText: '美女類型', helperText: '請輸入你喜歡的類型' ), autofocus: false, //自動對焦關閉 ), RaisedButton( onPressed:_choiceAction, child: Text('選擇完畢'), ), Text( showText, overflow:TextOverflow.ellipsis, maxLines: 1, ), ], ), ) ), ); }
Dio的get方法
布局完成后,可以先編寫一下遠程接口的調用方法,跟上面的內容類似,不過這里返回值為一個Future
,這個對象支持一個等待回掉方法then
。具體代碼如下:
Future getHttp(String TypeText)async{ try{ Response response; var data={'name':TypeText}; response = await Dio().get( "https://www.easy-mock.com/mock/5c60131a4bed3a6342711498/baixing/dabaojian", queryParameters:data ); return response.data; }catch(e){ return print(e); } }
得到數據后的處理
當我們寫完內容后,要點擊按鈕,按鈕會調用方法,並進行一定的判斷。比如判斷文本框是不是為空。然后當后端返回數據時,我們用setState方法更新了數據。具體代碼如下:
void _choiceAction(){ print('開始選擇你喜歡的類型:'); if(typeController.text.toString()==''){ showDialog( context: context, builder: (context) => AlertDialog(title:Text('美女類型不能為空')) ); }else{ getHttp(typeController.text.toString()).then((val){ setState(() { showText=val['data']['name'].toString(); }); }); } }
完整代碼:
import 'package:flutter/material.dart'; import 'package:dio/dio.dart'; class HomePage extends StatefulWidget { _HomePageState createState() => _HomePageState(); } class _HomePageState extends State<HomePage> { TextEditingController typeController = TextEditingController(); String showText = '歡迎你來到美好人間'; @override Widget build(BuildContext context) { return Container( child: Scaffold( appBar: AppBar(title: Text('美好人間'),), body:Container( height: 1000, child: Column( children: <Widget>[ TextField( //文本框 controller:typeController, decoration:InputDecoration ( contentPadding: EdgeInsets.all(10.0), labelText: '美女類型', helperText: '請輸入你喜歡的類型' ), autofocus: false, //自動對焦關閉 ), RaisedButton( onPressed:_choiceAction, child: Text('選擇完畢'), ), Text( showText, overflow:TextOverflow.ellipsis, maxLines: 1, ), ], ), ) ), ); } void _choiceAction(){ print('開始選擇你喜歡的類型............'); if(typeController.text.toString()==''){ showDialog( context: context, builder: (context)=>AlertDialog(title:Text('美女類型不能為空')) ); }else{ getHttp(typeController.text.toString()).then((val){ setState(() { showText=val['data']['name'].toString(); }); }); } } //返回值為一個Future,這個對象支持一個等待回掉方法then Future getHttp(String TypeText) async{ try{ Response response; var data={'name':TypeText}; response = await Dio().get( "https://www.easy-mock.com/mock/5c60131a4bed3a6342711498/baixing/dabaojian", queryParameters:data ); return response.data; }catch(e){ return print(e); } } }
Dio的POST使用
其實Post的使用非常簡單,主題代碼並沒有什么改動,只是把原來的get
換成Post
就可以了。代碼如下:
Future getHttp(String TypeText) async{ try{ Response response; var data={'name':TypeText}; response = await Dio().post( "https://www.easy-mock.com/mock/5c60131a4bed3a6342711498/baixing/post_dabaojian", queryParameters:data ); return response.data; }catch(e){ return print(e); } }
學習下來我們應該掌握如下知識點:
- 對Flutter動態組件的深入了解
- Future對象的使用
- 改變狀態和界面的setState的方法應用
- TextField Widget的基本使用