原文地址: 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,我们可以使用浏览器直接访问,来看看获取的数据,如下图所示

返回的数据是各大城市的相关数据,待会我们可以使用列表把城市名显示出来即可

请求接口的代码如下

  1. void getCityData() async {
  2. Response response;
  3. var dio = Dio();
  4. response = await dio.get('http://guolin.tech/api/china');
  5. print(response.data.toString());
  6. }

因为这里是数据是从接口获取的,数据为动态的,这里我们的页面得使用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开头的那个菜单即可自动导入

我们稍微改下代码,如下:

  1. void getCityData() async {
  2. Response response;
  3. var dio = Dio();
  4. response = await dio.get('http://guolin.tech/api/china',options: Options(responseType: ResponseType.plain));
  5. var list = jsonDecode(response.data);
  6. var cityList = list.map((m) => new CityModel.fromJson(m)).toList();
  7. print(cityList);
  8. }

这里我们可以看到代码的第五行,传了个options参数,options是为了设置返回的类型数据,如果没有这个的话,Dio会自动将返回的数据转为Json类型的对象

但是由于现在接口返回的一个Json数组的字符串,导致无法解析成功(平常接口都是一个json的字符串,郭霖大佬写得.. )

所以得采用此方法进行解析,之后将数据转为List类型,里面的每个数据都是实体类

3.列表展示

展示就比较简单了,我们使用ListView即可,不过,需要注意的是,得提前在State类中定义好一个List数组

接口请求到数据之后,更新此List数组里的数据即可达到更改UI的操作(注意使用setState()方法哦)

  1. void getCityData() async {
  2. var dio = Dio();
  3. Response response = await dio.get('http://guolin.tech/api/china',
  4. options: Options(responseType: ResponseType.plain));
  5. var list = jsonDecode(response.data);
  6. var cityList = list.map((m) => new CityModel.fromJson(m)).toList();
  7. //注意使用setState方法
  8. setState(() {
  9. //this.list是在State类中定义的
  10. this.list.addAll(cityList);
  11. });
  12. }

效果图

源码

  1. import 'dart:convert';
  2. import 'package:dio/dio.dart';
  3. import 'package:flutter/material.dart';
  4. import 'package:flutter_demo/model/city_model.dart';
  5. import 'package:webview_flutter/webview_flutter.dart';
  6. import 'MyMaterialPage.dart';
  7. class DioTestPage extends StatefulWidget {
  8. @override
  9. State<StatefulWidget> createState() {
  10. return DioTestState();
  11. }
  12. }
  13. class DioTestState extends State<DioTestPage> {
  14. List list = [];
  15. @override
  16. Widget build(BuildContext context) {
  17. return MyMaterialPage("Dio获取数据及展示", _listView());
  18. }
  19. @override
  20. void initState() {
  21. getCityData();
  22. }
  23. void getCityData() async {
  24. var dio = Dio();
  25. Response response = await dio.get('http://guolin.tech/api/china',
  26. options: Options(responseType: ResponseType.plain));
  27. var list = jsonDecode(response.data);
  28. var cityList =
  29. list.map((m) => new CityModel.fromJson(m)).toList();
  30. setState(() {
  31. this.list.addAll(cityList);
  32. });
  33. }
  34. Widget _listView() {
  35. return new ListView.builder(
  36. //listview的子项item数量
  37. itemCount: list.length,
  38. //内边距
  39. padding: new EdgeInsets.all(5.0),
  40. itemBuilder: (BuildContext context, int index) {
  41. //返回每个子项item的widget
  42. //城市名
  43. return _listItemView(list[index].name);
  44. },
  45. );
  46. }
  47. Widget _listItemView(String name) {
  48. return Row(
  49. children: [
  50. Center(
  51. child: Text(name),
  52. ),
  53. ],
  54. );
  55. }
  56. }

参考

  • [dio的中文文档](

Flutter学习(7)——网络请求框架Dio简单使用的更多相关文章

  1. Volley网络请求框架的基本用法

    备注: 本笔记是参照了 http://blog.csdn.net/ysh06201418/article/details/46443235  学习之后写下的 简介:  Volley是google官网退 ...

  2. Android网络请求框架AsyncHttpClient实例详解(配合JSON解析调用接口)

    最近做项目要求使用到网络,想来想去选择了AsyncHttpClient框架开进行APP开发.在这里把我工作期间遇到的问题以及对AsyncHttpClient的使用经验做出相应总结,希望能对您的学习有所 ...

  3. Android 网络请求框架android-async-http问题

    今天通过接口请求服务器的一些app数据,发现一个很奇怪的问题,请求一个链接的时候,通常在第一次请求发起的时候没有什么问题,能很快的拿到数据,但是 往后再去请求的时候就会等待很久,而且最后会请求失败,一 ...

  4. 基于Retrofit+RxJava的Android分层网络请求框架

    目前已经有不少Android客户端在使用Retrofit+RxJava实现网络请求了,相比于xUtils,Volley等网络访问框架,其具有网络访问效率高(基于OkHttp).内存占用少.代码量小以及 ...

  5. App 组件化/模块化之路——如何封装网络请求框架

    App 组件化/模块化之路——如何封装网络请求框架 在 App 开发中网络请求是每个开发者必备的开发库,也出现了许多优秀开源的网络请求库.例如 okhttp retrofit android-asyn ...

  6. XDroidRequest网络请求框架,新开源

    XDroidRequest 是一款网络请求框架,它的功能也许会适合你.这是本项目的第三版了,前两版由于扩展性问题一直不满意,思考来 思考去还是觉得Google的Volley的扩展性最强,于是借鉴了Vo ...

  7. 网络请求框架---Volley

    去年的Google I/O大会为android开发者带来了一个网络请求框架,它的名字叫做Volley.Volley诞生的使命就是让Android的网络请求更快,更健壮,而且它的网络通信的实现是基于Ht ...

  8. 安卓开发常用网络请求框架OkHttp、Volley、XUtils、Retrofit对比

    网络请求框架总结1.xutils     此框架庞大而周全,这个框架可以网络请求,同时可以图片加载,又可以数据存储,又可以 View 注解,使用这种框架很方便,这样会使得你整个项目对它依赖性太强,万一 ...

  9. Flutter学习笔记(14)--StatefulWidget简单使用

    如需转载,请注明出处:Flutter学习笔记(14)--StatefulWidget简单使用 今天上班没那么忙,突然想起来我好像没StatefulWidget(有状态组件)的demo,闲来无事,写一个 ...

随机推荐

  1. Redis热点key优化

    热门新闻事件或商品通常会给系统带来巨大的流量,对存储这类信息的Redis来说却是一个巨大的挑战.以Redis Cluster为例,它会造成整体流量的不均知,个别节点出现OPS过大的情况,极端情况下热点 ...

  2. 乘风破浪,.Net Core遇见Dapr,为云原生而生的分布式应用运行时

    Dapr是一个由微软主导的云原生开源项目,国内云计算巨头阿里云也积极参与其中,2019年10月首次发布,到今年2月正式发布V1.0版本.在不到一年半的时间内,github star数达到了1.2万,超 ...

  3. 不止Docker:8款容器管理开源方案

    Docker诞生于2013年,并普及了容器的概念,以至于大多数人仍然将容器的概念等同于"Docker容器". 作为第一个吃螃蟹的人,Docker设置了新加入者必须遵守的标准.例如, ...

  4. POJ 2002 二分 计算几何

    根据正方形对角的两顶点求另外两个顶点公式: x2 = (x1+x3-y3+y1)/2; y2 = (x3-x1+y1+y3)/2; x4= (x1+x3+y3-y1)/2; y4 = (-x3+x1+ ...

  5. Linux Netfilter框架分析

    目录 Netfilter框架 Netfilter的5个hook点 netfilter协议栈数据流分析 连接跟踪conntrack conntrack连接跟踪表条目 连接跟踪表大小 管理连接跟踪表 ip ...

  6. Reactive Spring实战 -- 响应式MySql交互

    本文与大家探讨Spring中如何实现MySql响应式交互. Spring Data R2DBC项目是Spring提供的数据库响应式编程框架. R2DBC是Reactive Relational Dat ...

  7. 前端 | Vue 路由返回恢复页面状态

    需求场景:首页搜索内容,点击跳转至详情页,页面后退返回主页,保留搜索结果. 方案:路由参数:路由守卫 需求描述 在使用 Vue 开发前端的时候遇到一个场景:在首页进行一些数据搜索,点击搜索结果进入详情 ...

  8. Java:代码高效优化

    本文转自阿里技术站,感谢阿里前辈提供的技术知识,微信关注 "阿里技术" 公众号即可实时学习. 1.常量&变量 1.1.直接赋值常量值,禁止声明新对象 直接赋值常量值,只是创 ...

  9. html javascript checkbox实现全选功能

    html代码 <input type="checkbox" id="all" />all</input> <input type= ...

  10. awk中printf的用法

    printf函数   打印输出时,可能需要指定字段间的空格数,从而把列排整齐.在print函数中使用制表符并不能保证得到想要的输出,因此,可以用printf函数来格式化特别的输出. printf函数返 ...