flutter从零开始搭建系列:

  • flutter之从零开始搭建(一)之 BottomNavigationBar
  • flutter之从零开始搭建(二)之 Navigator路由

项目还是在原来的基础上搭建,具体的可以看上面的连接

这次,我们来介绍下网络请求,并且将请求到的数据设置到ListView列表中。老规矩,先来看下效果图

页面看起来不错吧,在动手之前还是得说一下,首页数据来自wanandroid提供,毕竟用了别人的东西就得标明。

实战

flutter请求网络有两种,一种是http请求,一种是HttpClient请求,下面来分别来使用一下。

http方式

在使用http方式请求网络时,需要导入http包

//导入网络请求相关的包
import 'package:http/http.dart' as http; void _pullNet()  {http.get("http://www.wanandroid.com/project/list/1/json?cid=1").then((http.Response response) {var convertDataToJson = JSON.decode(response.body);convertDataToJson = convertDataToJson["data"]["datas"];//打印请求的结果print(convertDataToJson);//更新数据setState(() {data = convertDataToJson;});});}
复制代码

httpClient方式

需要导入httpClient包

import 'dart:io';void _httpClient() async {var responseBody;var httpClient = new HttpClient();var request = await httpClient.getUrl(Uri.parse("http://www.wanandroid.com/project/list/1/json?cid=1"));var response = await request.close();//判断是否请求成功if (response.statusCode == 200) {//拿到请求的数据responseBody = await response.transform(utf8.decoder).join();//解析json,拿到对应的jsonArray数据var convertDataToJson = jsonDecode(responseBody)["data"]["datas"];//更新数据setState(() {data = convertDataToJson;});} else {print("error");}}复制代码

知道了网络请求的概念,那么,我们先来写下界面

ListView界面布局

打开HomePage,

import 'package:flutter/material.dart';class HomePage extends StatefulWidget {@overrideState<StatefulWidget> createState() {// TODO: implement createStatereturn new HomeState();}
}@overrideWidget build(BuildContext context) {// TODO: implement buildreturn new Scaffold(body: new ListView(children: <Widget>[_getItem2(),_getItem2()]),);}Widget _getItem2() {return new Card(child: new Padding(padding: const EdgeInsets.all(10.0), child: _getRowWidget2(),),elevation: 3.0,margin: const EdgeInsets.all(10.0),);}Widget _getRowWidget2() {return new Row(children: <Widget>[new Flexible(flex: 1,fit: FlexFit.tight, //和android的weight=1效果一样child: new Stack(children: <Widget>[new Column(children: <Widget>[new Text("title".trim(),style: new TextStyle(color: Colors.black, fontSize: 20.0,),textAlign: TextAlign.left),new Text("desc", maxLines: 3,)],)],)),new ClipRect(child: new FadeInImage.assetNetwork(placeholder: "images/ic_shop_normal.png",image: "images/ic_shop_normal.png",width: 50.0,height: 50.0,fit: BoxFit.fitWidth,),),],);}复制代码

效果如下

ListView感觉看起来像是Android中的ScrollView+LineaLayout.vertical。

flutter的布局其实是个特别头疼的问题,widget特别多,没有android那么方便,也没有react-native的flex布局方便,迷之缩进更让人想删除widget都变得特别的困难,所以,在做布局这部分,我们尽可能的将widget做成分割出来,做成一个个的方法widget,然后组合起来。

数据填充

我们看到ListView接收的是一个widget数组,后台返回给我们jsonArray数据的时候,我们完全可以使用map来遍历数据,然后返回widget给Listview的children。

flutter是有生命周期的,大致生命周期可以分为

  • initState : 初始化widget的时候调用,只会调用一次。
  • build : 初始化之后开始绘制界面,当setState触发的时候会再次被调用
  • didUpdateWidget : 当触发setState时,会被调用
  • dispose : 页面销毁的时候调用

如果把他们和react-native进行分类看的话,下面是个对比

flutter react native
initState Mount等函数
didUpdateWidget update等函数
dispose Unmount等函数

所以,我们在请求网络的时候,将数据请求放在initState进行处理,下面贴出代码。

import 'dart:convert';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http; //导入网络请求相关的包class HomePage extends StatefulWidget {@overrideState<StatefulWidget> createState() {// TODO: implement createStatereturn new HomeState();}
}class HomeState extends State<HomePage> {//数据源List data;@overridevoid initState() {// TODO: implement initStatesuper.initState();_pullNet();}void _pullNet() async {await http.get("http://www.wanandroid.com/project/list/1/json?cid=1").then((http.Response response) {var convertDataToJson = JSON.decode(response.body);convertDataToJson = convertDataToJson["data"]["datas"];print(convertDataToJson);setState(() {data = convertDataToJson;});});}@overrideWidget build(BuildContext context) {// TODO: implement buildreturn new Scaffold(body: new ListView(children:  _getItem() ),);}List<Widget> _getItem() {return data.map((item) {return new Card(child: new Padding(padding: const EdgeInsets.all(10.0), child: _getRowWidget(item),),elevation: 3.0,margin: const EdgeInsets.all(10.0),);}).toList();}Widget _getRowWidget(item) {return new Row(children: <Widget>[new Flexible(flex: 1,fit: FlexFit.tight, //和android的weight=1效果一样child: new Stack(children: <Widget>[new Column(children: <Widget>[new Text("${item["title"]}".trim(),style: new TextStyle(color: Colors.black, fontSize: 20.0,),textAlign: TextAlign.left),new Text("${item["desc"]}", maxLines: 3,)],)],)),new ClipRect(child: new FadeInImage.assetNetwork(placeholder: "images/ic_shop_normal.png",image: "${item['envelopePic']}",width: 50.0,height: 50.0,fit: BoxFit.fitWidth,),),],);}
复制代码

然后我们来看下效果图

相信大家看到了一闪而过的红色报警图,虽然不影响最后的显示效果,但是,我们必须得去处理。

在控制台中,我看到了这样的一句异常

The method 'map' was called on null
复制代码

看到map我们这才焕然大悟,因为网络请求是异步的,当前界面因为要执行build界面的绘制,导致我们在_getItem中map遍历data数据时是个空值,然后再异步请求成功后,setState又重新给data赋了值,然后触发了界面重新绘制,这时候,map遍历是有值,然后就出现了一下会出现异常,然后又好了的原因。

我们得想个办法,并且能优雅的去解决这个问题,对了,我们只需要在ListView中对data进行判空处理不就行了吗,如果为空的话,我们给他设置一个预加载页面,如果不为空的话,直接就当前现在的这套流程。

ok,思路有了,开始干吧

直接看build方法进行更改

  @overrideWidget build(BuildContext context) {// TODO: implement buildreturn new Scaffold(body: new ListView(children: data != null ? _getItem() : _loading()),);}//预加载布局List<Widget> _loading() {return <Widget>[new Container(height: 300.0, child: new Center(child:new Column(mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[new CircularProgressIndicator(strokeWidth: 1.0,),new Text("正在加载"),],)),)];}
复制代码

然后我们再来看看效果图

gay gay gayhub

下次再见咯!

flutter之从零开始搭建(三)之 网络请求相关推荐

  1. Python爬虫学习笔记-第三课(网络请求模块下)

    网络请求模块下 1. urllib-get案例 1.1 代码需求:爬取贴吧数据 1.2 代码思路 1.3 代码实现 2. urllib-post案例 3. requests模块简介 3.1 get案例 ...

  2. Flutter网络请求方式总结

    转载于:https://www.jianshu.com/p/59fc5ed37453 前言 编写一个 App,最离不开的就是网络请求了.在Android 原生中,网络请求库一直在更新,网络请求库甚多: ...

  3. Flutter 项目实战 Dio网络请求 四

    /  HTTP  |   HTTPS  / HTTP是一个客户端(用户)和 服务端(网站)之间请求和应答的标准,通常使用TCP协议.客户端发起一个HTTP请求到服务器上指定端口(默认端口为80).客户 ...

  4. Flutter中的HTTP网络请求与JSON序列化

    Http 请求 查阅Flutter的相关资料,关于网络请求库,既可以用 dart:io 包中提供的HttpClient,也可以用 flutterchina 推荐的三方封装的请求库 dio 来发起网络请 ...

  5. 【Flutter】Flutter 开发环境搭建 ( Android Studio 下 Flutter / Dart 插件安装 | Flutter SDK 安装 | 环境变量配置 | 开发环境检查 )

    文章目录 一.Flutter 学习资料 二.Flutter 开发环境搭建 三.Android Studio 环境安装 Flutter / Dart 插件 四.下载 Flutter SDK 五.设置 F ...

  6. Android Flow遇见Retrofit网络请求实践

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/121754941 本文出自[赵彦军的博客] 文章目录 前言 RetrofitFlow ...

  7. 微信小程序入门二: 条件、遍历、网络请求、获取本地图片

    实例内容 条件渲染 数据遍历 网络请求 获取本地图片 实例一: 条件渲染 如果motto为Hello World,则输出你好世界,否则原样输出. 这里是分支条件判断,直接在视图文件里修改,修改inde ...

  8. 微信小程序-网络请求

    一.网络请求之前 在调用网络请求方法之前,需要在 「小程序后台-开发-开发设置-服务器域名」 中进行配置 不配置默认网络请求时无法通过的,当然也可以关闭校验,但是只在调试的时候生效,开发完成准备上线时 ...

  9. 微信小程序 网络请求接口 及 生命周期

    前言:前期我们对微信小程序有些基本了解,像标签,样式,组件....等. 今天我们继前期进行继续的了解 一. 网络请求 HTTP(HyperText Transfer Protocol)是一套计算机通过 ...

  10. Android之三种网络请求解析数据(最佳案例)

    小武:相信大家都用过网络请求解析数据,只是方法不一样而已,但是,逻辑都是差不多的: 一:AsyncTask解析数据 AsyncTask主要用来更新UI线程,比较耗时的操作可以在AsyncTask中使用 ...

最新文章

  1. 神器 jupyter,终于来了!
  2. python 3.9 新特性 简介
  3. MVC--Razor(2)
  4. lvs-nat负载均衡模式
  5. listView动态加载数据分页
  6. mysql动态扩展_动态可扩展查询MYSQL5.7JSON+虚拟列+Mybatis
  7. jcache_随机JCache内容:多个提供程序和JMX Bean
  8. python周志_Python几周学习内容小结
  9. TextDetection文本检测数据集汇总
  10. 三十岁还没做到管理层的人,后来都怎么样了?
  11. chrome官网下载网址
  12. 线性代数知识点汇总:行列式和矩阵
  13. 计算机应用基础配书光盘,计算机应用基础配书光盘系统客户端
  14. 带经纬度的水印相机_经纬度生成小工具(仿水印相机)
  15. 武汉高中计算机网络技术分数线,2021年武汉高中录取分数线排名公布
  16. SAP那些事-理论篇-1- SAP初次亲密接触
  17. 英语教师杂志英语教师杂志社英语教师编辑部2022年第16期目录
  18. 打开window常用程序快捷命令
  19. Macbook删除苹果系统,装单系统win10系统
  20. beeline执行sql语句_beeline执行sql脚本我世界开挂

热门文章

  1. 网易云登陆界面怎么用PHP做,网易云音乐登录流程图
  2. 信息可视化图表设计指南
  3. 数据分析实战项目练习——物流行业数据分析
  4. Camera 图像处理原理分析- 色彩篇 二
  5. 谈谈新加坡的教育和学区房
  6. GBT 31000-2015 社会治安综合治理基础数据规范 数据项 编码
  7. 偏振光工业相机_工业相机选择六大参数必看
  8. 微信小程序—给图片添加相框
  9. python图片处理大全_python图像处理:怎么给图片加框?
  10. html半圆形效果图,html5 canvas半圆形百分比进度条动画特效