上期讲到了,怎样实现一个下拉刷新和加载更多的列表,数据更新,需要使用到网络请求,在flutter中,怎样实现一个网络请求呢?官方使用的是dart io中的HttpClient发起的请求,但HttpClient本身功能较弱,很多常用功能都不支持。所以这里我们直接使用国内的开源库 diodio是一个强大的Dart Http请求库,支持Restful API、FormData、拦截器、请求取消、Cookie管理、文件上传/下载、超时、自定义适配器等功能。

首先我们导入开源库dio,目前的最新版本是 dio: ^3.0.9 , 具体用发可以参考github上的开源项目,文档还是比较详细的。

这里就拿我写的一个首页轮播图的网络请求来介绍一下,首先我们定义一个全局的dio实例,可以在具体代码如下:

// 或者通过传递一个 `options`来创建dio实例
BaseOptions options = BaseOptions(
baseUrl: "https://www.wanandroid.com/",
connectTimeout: 10000,
receiveTimeout: 5000,
) ; Dio dio=Dio(options);

通过这个实例可以拿到get,post,pull等方式进行网络请求,这里我们用get请求获取一个轮播图的数据,数据来源于玩Android开放api,通过get方法获取一个Response对象,在Response对象中我们可以拿到返回值,然后就可以更新我们的UI了,这里更新UI的时候需要调用setState方法,在setState方法中去更新UI

,代码如下:

 getBanner() async {
///轮播图接口请求
Response responseBanner = await dio.get("banner/json"); ///接口调用成功后更新数据需要调用setState()方法
setState(() {
///轮播图实体解析
BannerBaenEntity bannerEntity =
BannerBaenEntity().fromJson(jsonDecode(responseBanner.toString()));
_banners = bannerEntity.data;
});
}

这里要注意的是,接口请求一般都是异步的,所以要声明此方法为async方法,然后用await修饰dio.get方法来获取response对象。此时不需要我们手动去切换到主线程,这里和kotlin的协程用法还是蛮像的。

这里我们还需要自定义一个轮播图控件,采用的是官方的控件PageView,类似Android的ViewPage,但是此控件并不支持循环播放和自动切换功能,轮播图是需要支持循环播放和自动切换功能,并且手动滑动的时候要停止自动切换功能,手指拿开后再开始自动切换。

1.首先来实现一下循环自动播放功能,利用Timer.periodic实现一个定时器,每隔3秒自动切换到下一张图片,同时加一个滑动动画效果,具体代码如下:

  _timer = Timer.periodic(Duration(seconds: 3), (t) {
_curIndex++;
//执行滑动动画
_pageController.animateToPage(
_curIndex,
duration: Duration(milliseconds: 300),
curve: Curves.linear,
);

这里要注意一下,如果我们不给PageView.builder设置itemCount的情况下,pageview是长度是无限的,默认是支持无限右边滑动的,所以我们只需要在pageView滑动监听的时候,判断当前滑动位置如果是0的时候,将当前图片位置设置为轮播图数据的长度,即可实现轮播图滑动到左边的时候可以继续滑动的循环效果。同时为来避免第一次创建轮播图的时候,用户手动像左边滑动的情况,我们在创建的时候,需要指定轮播图的索引为数据的N倍。具体代码:

//轮播图初始化设置
@override
void initState() {
super.initState();
_curIndex = widget._banners.length * 5; //设置轮播图的初始索引位置
_pageController = PageController(initialPage: _curIndex); //初始化轮播图控制器
_initTimer();
}
//构造一个pageview组件
PageView.builder(
controller: _pageController, //设置pageview控制器
onPageChanged: (index) {
//刷新pageview数据
setState(() {
_curIndex = index;
//重新设置pageview的索引位置
if (index == 0) {
_curIndex = length;
_changePage();
}
});
})

2.我们需要监听item图片的用户手势,当用户手指按下并且滑动时,我们需要停止计时器,手指拿开时开启计时器,经过测试发现,手指按下滑动时,可以监听到,但是手机拿开时监听不到,所以这里暂时只监听手指按下时,停止计时器,并且在此启动计时器。具体代码如下:

//取消计时器
_cancelTimer() {
if (_timer != null) {
_timer.cancel();
_timer = null;
_initTimer();//在此启动计时器,3秒后执行切换
}
} GestureDetector(
//手指按下并滑动时执行此方法
onPanDown: (details) {
_cancelTimer();
},
//手指点击执行的方法,点击轮播图跳转页面
onTap: () {
Navigator.of(context).push(MaterialPageRoute(builder: (_) {
return WebViewPage(widget._banners[index%length].url);
}));
},
//设置轮播图item,这里就是一张网络图片加载。
child: Image.network(
widget._banners[index % length].imagePath,
fit: BoxFit.cover,
),
)

Flutter学习五之网络请求和轮播图的实现的更多相关文章

  1. Bootstrap 学习笔记 项目实战 响应式轮播图

    左右两个箭头可以随浏览器缩放进行移动 保持在图片中间 Html代码: <!DOCTYPE html> <html lang="zh-cn"> <hea ...

  2. 自己动手丰衣足食之轮播图一动态修改marginTop属性实现轮播图

    引言 学习jQuery有年头了,刚开始学习时自己动手写过轮播图,放的久了以至于忘了大致思路了.现在转而做前端,抽空把jquery轮播图拿出来写一写,把各种思路都自己练习练习,这里主要使用动态修改mar ...

  3. 05-06 Flutter JSON和序列化反序列化、创建模型类转换Json数据、轮播图数据渲染:Flutter创建商品数据模型 、请求Api接口渲染热门商品 推荐商品

    Config.dart class Config{ static String domain='http://jd.itying.com/'; } FocusModel.dart class Focu ...

  4. vue移动音乐app开发学习(三):轮播图组件的开发

    本系列文章是为了记录学习中的知识点,便于后期自己观看.如果有需要的同学请登录慕课网,找到Vue 2.0 高级实战-开发移动端音乐WebApp进行观看,传送门. 完成后的页面状态以及项目结构如下: 一: ...

  5. iOS最笨的办法实现无限轮播图(网络加载)

    iOS最笨的办法实现无限轮播图(网络加载) 简单的做了一下: 使用方法: 把 请求返回的 图片地址(字符串类型)放进数组中就行 可以使用SDWebImage(我就是用的这个)等..需要自己导入并引用, ...

  6. 【云开发】10分钟零基础学会做一个快递查询微信小程序,快速掌握微信小程序开发技能(轮播图、API请求)

    大家好,我叫小秃僧 这次分享的是10分钟零基础学会做一个快递查询微信小程序,快速掌握开发微信小程序技能. 这篇文章偏基础,特别适合还没有开发过微信小程序的童鞋,一些概念和逻辑我会讲细一点,尽可能用图说 ...

  7. ReactNative新手学习之路04 组件化开发轮播图swiper支持安卓和IOS

    react native 新手之路04 组件化开发轮播图swiper支持安卓和IOS npm install react-native-carousel --save git 地址Properties ...

  8. JS学习笔记--轮播图效果

    希望通过自己的学习收获哪怕收获一点点,进步一点点都是值得的,加油吧!!! 本章知识点:index this for if else 下边我分享下通过老师教的方式写的轮播图,基础知识实现: 1.css代 ...

  9. 动态请求数据并放入bootstrap轮播图

    下面是前端代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...

随机推荐

  1. 用终端命令行(BASH)将本地项目上传到Github并提交代码

    第一步: 在Github上创建自己的repository 第二步:建立本地仓库cd到你的本地项目根目录下,执行git命令 1:$ cd 到你的项目目录下 2:$ git init 第三步:将本地项目工 ...

  2. JAVA设计模式简介及六种常见设计模式详解

    一.什么是设计模式                                                                                           ...

  3. python 用 prettytable 输出漂亮的表格

    原文链接:https://linuxops.org/blog/python/prettytable.html #!/usr/bin/python #**coding:utf-** import sys ...

  4. play ball小游戏-Alpha版本发布说明

    Alpha版本发布说明 一.功能介绍 本团队所做的微信小程序是一款小球经碰撞后最终到达目的位置通关的休闲益智类游戏.Alpha版本具有的功能大体如下: 1. 闯关模式 多达12关普通竖屏关卡.4关特殊 ...

  5. 如何加速github下载速度

    第一步 魔法 第二步 git config --global http.proxy http://127.0.0.1:1080 git config --global https.proxy http ...

  6. 3d相册展示

    示例代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta ...

  7. 基于postman的api自动化测试实践

    测试的好处 每个人都同意测试很重要,但并不是所有人都会去做.每当你添加新的代码,测试可以保证你的api按照预期运行.通过postman,你可以为所有api编写和运行测试脚本. postman中的测试 ...

  8. 【亲测】手把手教你如何破解pycharm(附安装包和破解文件)

    此教程支持最新的2019.3版本的Pycharm,并兼容之前的版本. 一.准备工作: 1.下载Pycharm 有条件的可以自行去官网下载,这里我提供了我下载的版本,已上传到百度网盘,链接在下方. 2. ...

  9. Android开发之制作圆形头像自定义View,直接引用工具类,加快开发速度。带有源代码学习

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 QQ986945193 博客园主页:http://www.cnblogs.com/mcxiaobing ...

  10. shader之间的数据传递

    shader之间传递数据实在是太常用了. 下面我们总结几种shader之间传递数据的方法. Name based matching 最简单,也是最常用的一种传递方式是依靠名字进行匹配. 例如我们从ve ...