Flutter学习(7)——网络请求框架Dio简单使用
原文地址: Flutter学习(7)——网络请求框架Dio简单使用 | Stars-One的杂货小窝
Flutter系列学习之前都是在个人博客发布,感兴趣可以过去看看
网络请求一般APP都是需要的,在Flutter中,目前比较流行的网络请求框架是Dio,是Flutter中文网推出的,也算是国人开发的
本文主要是讲解如何简单使用Dio的get请求来获取数据,并使用Flutter中的listview进行展示
关于listview在之前已经讲过使用方法 不清楚的同学可以先去看看Flutter学习(6)——Tab导航与ListView使用 | Stars-One的杂货小窝
Dio介绍
dio是一个强大的Dart Http请求库,支持Restful API、FormData、拦截器、请求取消、Cookie管理、文件上传/下载、超时、自定义适配器等...
实现过程
1.get请求数据
这里,我们使用最为简单的get请求方式来获取数据,接口的话我们使用郭霖大佬提供的API接口http://guolin.tech/api/china,我们可以使用浏览器直接访问,来看看获取的数据,如下图所示

返回的数据是各大城市的相关数据,待会我们可以使用列表把城市名显示出来即可
请求接口的代码如下
void getCityData() async {
Response response;
var dio = Dio();
response = await dio.get('http://guolin.tech/api/china');
print(response.data.toString());
}
因为这里是数据是从接口获取的,数据为动态的,这里我们的页面得使用StatefulWidget,则是在State类初始化initState方法的时候调用接口

代码跑起来,进到页面,发现报错了 错误如下所示:

百度一看,是因为Android高版本不支持http协议的缘故,所以,按照之前的老套路,加个xml配置,调整即可,具体可参考Android 9 网络请求失败 | Stars-One的杂货小窝

按照上面的步骤配置后,再来试下(注意需要停止APP后重新进行编译,然后再点debug或run的图标,使用热重载是不会起作用的)
ok,成功调通,数据已经打印出来了:happy:

2.实体类创建
之前我们Android开发的时候,使用的是Gson解析json字符串,将json字符串转为对应的实体类,好方便我们取值,这里,flutter同样也是
这里推荐使用个插件JsonToDart进行实体类的生成,插件地址
安装好插件后,我们要使用的话,可以右键,然后悬着具体菜单即可新建即可,这里我是建了个model文件夹,右键model文件夹, New -> Json To Dart


把json字符串输入进去,输入类名,之后点击Generate即可生成一个dart的实体类文件
以往Android开发中我们是使用Gson等框架,把json字符串转为实体类
而在flutter中,由于其内置有Json类型的数据,所以不必要再引入其他框架,使用jsonDecode方法即可
小提示:如果直接复制,
jsonDecode可能会报错,因为还没有导入,可以光标选择jsonDecode,按下alt+enter,选择import开头的那个菜单即可自动导入
我们稍微改下代码,如下:
void getCityData() async {
Response response;
var dio = Dio();
response = await dio.get('http://guolin.tech/api/china',options: Options(responseType: ResponseType.plain));
var list = jsonDecode(response.data);
var cityList = list.map((m) => new CityModel.fromJson(m)).toList();
print(cityList);
}
这里我们可以看到代码的第五行,传了个options参数,options是为了设置返回的类型数据,如果没有这个的话,Dio会自动将返回的数据转为Json类型的对象
但是由于现在接口返回的一个Json数组的字符串,导致无法解析成功(平常接口都是一个json的字符串,郭霖大佬写得.. )
所以得采用此方法进行解析,之后将数据转为List类型,里面的每个数据都是实体类
3.列表展示
展示就比较简单了,我们使用ListView即可,不过,需要注意的是,得提前在State类中定义好一个List数组
接口请求到数据之后,更新此List数组里的数据即可达到更改UI的操作(注意使用setState()方法哦)
void getCityData() async {
var dio = Dio();
Response response = await dio.get('http://guolin.tech/api/china',
options: Options(responseType: ResponseType.plain));
var list = jsonDecode(response.data);
var cityList = list.map((m) => new CityModel.fromJson(m)).toList();
//注意使用setState方法
setState(() {
//this.list是在State类中定义的
this.list.addAll(cityList);
});
}
效果图

源码
import 'dart:convert';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:flutter_demo/model/city_model.dart';
import 'package:webview_flutter/webview_flutter.dart';
import 'MyMaterialPage.dart';
class DioTestPage extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return DioTestState();
}
}
class DioTestState extends State<DioTestPage> {
List list = [];
@override
Widget build(BuildContext context) {
return MyMaterialPage("Dio获取数据及展示", _listView());
}
@override
void initState() {
getCityData();
}
void getCityData() async {
var dio = Dio();
Response response = await dio.get('http://guolin.tech/api/china',
options: Options(responseType: ResponseType.plain));
var list = jsonDecode(response.data);
var cityList =
list.map((m) => new CityModel.fromJson(m)).toList();
setState(() {
this.list.addAll(cityList);
});
}
Widget _listView() {
return new ListView.builder(
//listview的子项item数量
itemCount: list.length,
//内边距
padding: new EdgeInsets.all(5.0),
itemBuilder: (BuildContext context, int index) {
//返回每个子项item的widget
//城市名
return _listItemView(list[index].name);
},
);
}
Widget _listItemView(String name) {
return Row(
children: [
Center(
child: Text(name),
),
],
);
}
}
参考
- [dio的中文文档](
Flutter学习(7)——网络请求框架Dio简单使用的更多相关文章
- Volley网络请求框架的基本用法
备注: 本笔记是参照了 http://blog.csdn.net/ysh06201418/article/details/46443235 学习之后写下的 简介: Volley是google官网退 ...
- Android网络请求框架AsyncHttpClient实例详解(配合JSON解析调用接口)
最近做项目要求使用到网络,想来想去选择了AsyncHttpClient框架开进行APP开发.在这里把我工作期间遇到的问题以及对AsyncHttpClient的使用经验做出相应总结,希望能对您的学习有所 ...
- Android 网络请求框架android-async-http问题
今天通过接口请求服务器的一些app数据,发现一个很奇怪的问题,请求一个链接的时候,通常在第一次请求发起的时候没有什么问题,能很快的拿到数据,但是 往后再去请求的时候就会等待很久,而且最后会请求失败,一 ...
- 基于Retrofit+RxJava的Android分层网络请求框架
目前已经有不少Android客户端在使用Retrofit+RxJava实现网络请求了,相比于xUtils,Volley等网络访问框架,其具有网络访问效率高(基于OkHttp).内存占用少.代码量小以及 ...
- App 组件化/模块化之路——如何封装网络请求框架
App 组件化/模块化之路——如何封装网络请求框架 在 App 开发中网络请求是每个开发者必备的开发库,也出现了许多优秀开源的网络请求库.例如 okhttp retrofit android-asyn ...
- XDroidRequest网络请求框架,新开源
XDroidRequest 是一款网络请求框架,它的功能也许会适合你.这是本项目的第三版了,前两版由于扩展性问题一直不满意,思考来 思考去还是觉得Google的Volley的扩展性最强,于是借鉴了Vo ...
- 网络请求框架---Volley
去年的Google I/O大会为android开发者带来了一个网络请求框架,它的名字叫做Volley.Volley诞生的使命就是让Android的网络请求更快,更健壮,而且它的网络通信的实现是基于Ht ...
- 安卓开发常用网络请求框架OkHttp、Volley、XUtils、Retrofit对比
网络请求框架总结1.xutils 此框架庞大而周全,这个框架可以网络请求,同时可以图片加载,又可以数据存储,又可以 View 注解,使用这种框架很方便,这样会使得你整个项目对它依赖性太强,万一 ...
- Flutter学习笔记(14)--StatefulWidget简单使用
如需转载,请注明出处:Flutter学习笔记(14)--StatefulWidget简单使用 今天上班没那么忙,突然想起来我好像没StatefulWidget(有状态组件)的demo,闲来无事,写一个 ...
随机推荐
- Excel的布尔值运算
TRUE被当做1进行加减乘除,例:1-TRUE=0. FALSE被当做0进行加减乘除,例:1-FALSE=1.(当做除数时,会因为分母为0返回错误值)
- 29、html介绍
29.1.前端概述: 1.html.css.js之间的关系: html是页面布局,css是页面渲染,js是让页面动起来(让页面和用户进行交互): 2.浏览器访问web站点获取html页面图示: 3.h ...
- SpringBoot统一处理返回结果和异常情况
如果文章有帮助到你,还请点个赞或留下评论 原因 在springboot项目里我们希望接口返回的数据包含至少三个属性: code:请求接口的返回码,成功或者异常等返回编码,例如定义请求成功. messa ...
- Java线程池中的核心线程是如何被重复利用的?
真的!讲得太清楚了!https://blog.csdn.net/MingHuang2017/article/details/79571529 真的是解惑了 本文所说的"核心线程". ...
- java -jar 运行springboot项目时内存设置
java -Xms64m #JVM启动时的初始堆大小 -Xmx128m #最大堆大小 -Xmn64m #年轻代的大小,其余的空间是老年代 -XX:MaxMetaspaceSize=128m # -XX ...
- 所有的Java虚拟机必须实现在每个类或接口被Java程序 “ 首次主动使用 ” 时才初始化他们
原文:https://www.cnblogs.com/fanjie/p/6916784.html Java程序对类的使用方式可分为两种– 主动使用– 被动使用 被动使用以后再讲,这里说说什么是主动使用 ...
- mybatis 配置的log4j文件无效,不能正常显示日志信息
正在学习mybatis,配置好后log4j.properties文件后,日志信息不能正常显示,没有效果. 查看了一下mybatis的相关文档,在日志一栏找到问题愿意 原因是我们的mybatis选了其他 ...
- Jsp自定义标签,配置tld文件
Program:Jsp自定义标签,.tld文件的配置 1 <?xml version="1.0" encoding="UTF-8" ?> 2 3 & ...
- python使用笔记21--发邮件
发邮件需要第三方模块 pip install yamail 1 #import yagmail #--别人写的,发中文附件的时候是乱码 2 import yamail #牛牛基于yagmail改的 3 ...
- 使用Nginx将请求转发至Google Analytics实现后端数据统计
前言 Google Analytics 加载缓慢是本博客在国内访问缓慢的原因之一.虽然通过使用大公司的 ga.js 的 CDN ,可以很大程度上加快加载 ga.js 文件的速度( ga.js 的更新频 ...