Flutter之Dio引入和簡單的Get/Post請求


先在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請求和動態組件協作

示例的具體業務邏輯是這樣的:

  1. 我們制作一個文本框,用於輸入需要什么樣的美女為我們服務
  2. 然后點擊按鈕,相當於去后端請求數據
  3. 后端返回數據后,根據你的需要美女就會走進房間

生成動態組件

可以使用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的基本使用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM