上期讲到了,怎样实现一个下拉刷新和加载更多的列表,数据更新,需要使用到网络请求,在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. adb修改手机分辨率

    一.手机分辨率对照表 宽×高(标准值) 240×320 320×480 480×800 720×1280 1080×1920 1440×2560 DPI等级 LDPI MDPI HDPI XHDPI ...

  2. Mybatis_day2

    二 mybatis配置详解 MyBatis最关键的组成部分是SqlSessionFactory,我们可以从中获取SqlSession, 并执行映射的SQL语句.SqlSessionFactory对象可 ...

  3. 如何选择一台适合Java开发的电脑

    前言 最近在群里有同学求推荐Java开发用的电脑,所以胖哥就出个简单的专题,用我贫瘠的电脑知识来帮助大家选择适合开发的电脑配置.因为家里的主机已经带不动两个 IDEA 了,更别提开个 Docker 啥 ...

  4. get customer attribute option

    Mage::getResourceSingleton('customer/customer')->getAttribute('gender')->getSource()->getAl ...

  5. FastStone Capture注册破解码

    原文链接:https://blog.csdn.net/lxq_9532/article/details/82893170 faststone-capture下载链接: https://en.softo ...

  6. lx

    自我介绍:我是18软件技术5班 张震. -统计截止目前为止我自己写过代码3000行,我希望在本课结束后累计到10000行代码, 选择自测题17分,错题大多是运算符和运算符先 后级一类的题,编程题不会, ...

  7. jmeter http并发测试时报错

    错误信息如下:jmeter Response code: Non HTTP response code: java.net.URISyntaxException 网上收了一大堆,都没法解决 我的用到了 ...

  8. Python字符串类型格式化之format方法

    python字符串格式化一般使用 format() 方法,用法如下: <模板字符串>.format(<逗号分割的参数>) 其中模板字符串中可以由一个或多个 {} 组成的 槽 , ...

  9. Urule开源版系列4——Core包核心接口之规则解析过程

    Urule运行规则文件,是如何进行的,通过一个请求doTest来探一下 com.bstek.urule.console.servlet.respackage.PackageServletHandler ...

  10. oeasy教您玩转linux010105详细手册man

    详细手册 回忆上节课 我们上节课学习了使用命令来了解命令 whatis 我们通过他来发出灵魂之问 whatis到底是干什么的?