大部分app都有轮播图,通常是展现一些新闻公告通知等图片,在flutter最强大的siwiper, 多种布局方式,无限轮播,Android和IOS双端适配,github:flutter_swipergit
通常是从本地代码中或者使用网络图片,那么,首先将资源添加到项目的 pubspec.yaml 文件中(更多细节请参阅Assets and images):github
flutter: assets: - images/news_1.png - images/news_1.png - images/news_1.png
若是项目中所须要使用的图片资源太多,也能够直接直接这样写:
(1)、包含一个目录下的全部 assets,须要在目录名称的结尾加上/
:segmentfault
flutter: assets: - assets/
注意只包含目录下根节点的全部文件。
(2)、若是要添加子目录下的文件,须要给每一个目录建立节点:后端
flutter: assets: [images/,images/index-icons/] # 配置代码中使用的图片所放置的文件夹及其子文件夹
在pubspec.yaml文件里添加网络
flutter\_swiper : ^lastest\_version到项目根目录下的 pubspec.yaml ,而且根目录运行命令行app
flutter packages get
flutter_swiper的最新版本号查看:pub.dev:flutter_swiperide
import 'package:flutter/material.dart'; import 'package:flutter_swiper/flutter_swiper.dart'; import 'message.dart'; class IndexScreen extends StatefulWidget { @override _SwiperViewState createState() => _SwiperViewState(); } class _SwiperViewState extends State<IndexScreen> { // 声明一个list,存放image Widget List<Widget> imageList = List(); @override void initState() { imageList ..add(Image.asset( 'images/news_1.png', height: 200, fit: BoxFit.fitWidth, // 显示可能拉伸,可能裁剪,宽度充满 )) ..add(Image.asset( 'images/news_2.png', height: 200, fit: BoxFit.fitWidth, )) ..add(Image.asset( 'images/news_3.png', height: 200, fit: BoxFit.fitWidth, )); super.initState(); } @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar( leading: Builder( builder: (BuildContext context) { // APP的logo图 return Image.asset('images/logo-header.png'); }, ), title: new Text( 'APP style: TextStyle(fontSize: 18.0, height: 1.2, fontFamily: "Courier"), ), actions: <Widget>[ new IconButton( icon: new Icon(Icons.message), onPressed: () { // 右上角的通知消息图标,点击进入消息列表 Navigator.push( context, new MaterialPageRoute( builder: (context) => new MessageScreen()), ); }), ], ), body: Column( children: <Widget>[ Container( width: MediaQuery.of(context).size.width, height: 200, child: new Swiper( itemBuilder: _swiperBuilder, itemCount: 3, itemWidth: MediaQuery.of(context).size.width, itemHeight: 200.0, loop: true, autoplay: true, pagination: null, control: null, viewportFraction: 1, scale: 1, ), ), Container( // padding: const EdgeInsets.fromLTRB(0, 10, 0, 5), width: MediaQuery.of(context).size.width, // height: MediaQuery.of(context).size.height, // 将上方的header、底部菜单和轮播图的高度减掉 height: MediaQuery.of(context).size.height - 400, child: new Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, //对齐方式:平均间隔 children: [ // 下方的其余页面布局 ], ), ), ], ), ); } Widget _swiperBuilder(BuildContext context, int index) { return (imageList[index]); } }
以上是使用静态资源加载图片来实现轮播图,实际项目中,基本都是后端接口返回的数据,这就涉及到另外的知识点, GitHub - dio: 发起网络请求 这块的使用会在另外一篇文章里具体再写,这里省略掉了,等以后写好了dio的相关学习记录,再来贴文章连接。
经过接口请求后端返回的数据后,对数据进行处理并经过setState来更新视图,代码:oop
setState(() { // 处理返回数据 var rtn = response.data['content']; rtn.forEach((f) { // print("image title:" + f["title"] + " imageUrl:" + f["imageUrl"]); imageList ..add(Image.network( f["imageUrl"], height: 200, fit: BoxFit.fitWidth, // 显示可能拉伸,可能裁剪,宽度充满 )); }); // print(imageList); });
参考资料:
github:flutter_swiper
Assets and images
pub.dev:flutter_swiper
笔记-Flutter之轮播图(多样式)布局
Flutter APP开发 学习记录: bottomNavigationBar底部导航菜单 本篇文章是底部导航菜单这篇文章中对应的IndexScreen()
的布局post