博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
06-Flutter移动电商实战-dio基础_Get_Post请求和动态组件协作
阅读量:7263 次
发布时间:2019-06-29

本文共 5203 字,大约阅读时间需要 17 分钟。

上篇文章中,我们只看到了 dio 的使用方式,但并未跟应用关联起来,所以这一篇将 dio 网络请求与应用界面结合起来,当然这也是为以后的实战作基础准备,基础打牢,我们才能飞速前进。

1、案例说明

我们还是作去“大保健”选择服务对象这个例子,不过这次我们使用按钮和动态组件来实现。具体业务逻辑是这样的:

  1. 我们制作一个文本框,用于输入需要什么样的美女为我们服务
  2. 然后点击按钮,相当于去后端请求数据
  3. 后端返回数据后,根据你的需要美女就会走进房间

一图顶千言

2、生成动态组件

可以使用stful的快捷方式,在AndroidStudio里快速生成StatefulWidget的基本结构,我们只需要改一下类的名字就可以了,就会得到如下代码.

class HomePage extends StatefulWidget {
  _HomePageState createState() => _HomePageState(); } class _HomePageState extends State
 {
  @override   Widget build(BuildContext context) {
    return Container(        child: child,     );   } }

3、加入文本框Widget

有了动态组件,咱们先把界面布局作一下。

Widget build(BuildContext context) {
    return Container(         child: Scaffold(           appBar: AppBar(title: Text('美好人间'),),           body:Container(             height: 1000,             child: Column(               children: 
[                 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: 2,                 ),                 ],             ),           )          ),     );   }

4、Dio的get_post方法

布局完成后,可以先编写一下远程接口的调用方法,跟上节课的内容类似,不过这里返回值为一个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);     }   }

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);     }   }

为何要返回 Feature,只有返回 Feature 才能使用 then 回调。

5、得到数据后的处理

当我们写完内容后,要点击按钮,按钮会调用方法,并进行一定的判断。比如判断文本框是不是为空。然后当后端返回数据时,我们用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();          });         });     }   }

6、案例全部代码

import 'package:flutter/material.dart'; import 'package:dio/dio.dart'; class HomePage extends StatefulWidget {
  _HomePageState createState() => _HomePageState(); } class _HomePageState extends State
 {
  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: 
[                 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: 2,                 ),                 ],             ),           )          ),     );   }   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 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);     }   } }

7、总结

通过这节课的学习,我们应该掌握如下知识点

  1. 对Flutter动态组件的深入了解
  2. Future对象的使用
  3. 改变状态和界面的setState的方法应用
  4. TextField Widget的基本使用

转载于:https://www.cnblogs.com/niceyoo/p/11028899.html

你可能感兴趣的文章
C# 调用IP库(QQWry.Dat)查询IP位置及自动升级IP库方法(附IP库下载地址及相关dll下载)...
查看>>
类(母版)和对象(纸币)的关系
查看>>
怎么进行项目管理
查看>>
MySQL · 捉虫动态 · Error in munmap() "Cannot allocate memory"
查看>>
IDEA里运行代码时出现Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Logger的解决办法(图文详解)...
查看>>
memset用法详解(转)
查看>>
AgileEAS.NET5.0-界面设计器-使用说明书(上)
查看>>
每日算法之三十八:Anagrams
查看>>
数据库单元测试 What is database unit testing?
查看>>
etlpy: 并行爬虫和数据清洗工具(开源)
查看>>
Silverlight 5 beta新特性探索系列:3.Silverlight5中的文字增进控制【附带实例源码】...
查看>>
zoj 3829 Known Notation(2014在牡丹江区域赛k称号)
查看>>
明晰C++内存分配的五种方法的区别
查看>>
CMPH——C Minimal Perfect Hashing Library【译】
查看>>
Ambari架构及安装
查看>>
SQL ALTER TABLE 语句
查看>>
1.第一章linux基础入门
查看>>
我所理解的OOP——UML六种关系
查看>>
web.config配置专题
查看>>
从Linux内核中获取真随机数【转】
查看>>