Flutter学习笔记(12)--列表组件
如需转载,请注明出处:Flutter学习笔记(12)--列表组件
在日常的产品项目需求中,经常会有列表展示类的需求,在Android中常用的做法是收集数据源,然后创建列表适配器Adapter,将数据源传递到Adapter中,最终进行列表数据的展示,那么在Flutter中如何处理列表数据呢?
在Flutter中,用ListView来显示列表项,其支持垂直和水平方向展示,通过过一个属性我们就可以控制其方向,列表有以下分类:
1.水平的列表
2.垂直的列表
3.数据量非常大的列表
4.矩阵式的列表
垂直列表组件
| 属性名 | 类型 | 默认值 | 说明 |
| ScrollDirection | Axis | Axis.vertical | 列表的排列方向,Axis.vertical为垂直方向,Axis.horizontal为水平方向 |
| padding | EdgeInsetsGeometry | 列表内部的空白区域,如果有child的话,child位于padding内部 | |
| reverse | bool | false | 组件排列反向 |
| children | List<Widget> | 列表元素,注意List元素全部为Widget类型 |
示例代码如下:
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart'; void main() => runApp(DemoApp()); class DemoApp extends StatelessWidget{
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'ListView Demo',
home: new ListViewDemo(),
);
}
} class ListViewDemo extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: Text('ListView Dmoe'),
leading: new Icon(Icons.menu,size: ,color: Colors.white,),
actions: <Widget>[
new IconButton(icon: Icon(Icons.search), onPressed: (){
Fluttertoast.showToast(msg: '点击了搜索按钮',toastLength: Toast.LENGTH_LONG,textColor: Colors.white,gravity: ToastGravity.BOTTOM);
})
],
),
body: new ListView(
// padding: new EdgeInsets.symmetric(vertical: 10,horizontal: 10),//给子元素设置水平和垂直方向的padding
padding: new EdgeInsets.only(left: ,top: ,right: ,bottom: ),//给子元素设置左、上、右、下的padding
children: <Widget>[
//数据源
ListTile(leading: new Icon(Icons.add_circle_outline),title: new Text('第一条数据'),),
ListTile(leading: new Icon(Icons.add_circle_outline),title: new Text('第二条数据'),),
ListTile(leading: new Icon(Icons.add_circle_outline),title: new Text('第三条数据'),),
ListTile(leading: new Icon(Icons.add_circle_outline),title: new Text('第四条数据'),),
ListTile(leading: new Icon(Icons.add_circle_outline),title: new Text('第五条数据'),),
ListTile(leading: new Icon(Icons.add_circle_outline),title: new Text('第六条数据'),),
ListTile(leading: new Icon(Icons.add_circle_outline),title: new Text('第七条数据'),),
ListTile(leading: new Icon(Icons.add_circle_outline),title: new Text('第八条数据'),),
ListTile(leading: new Icon(Icons.add_circle_outline),title: new Text('第九条数据'),),
ListTile(leading: new Icon(Icons.add_circle_outline),title: new Text('第十条数据'),),
],
),
);
}
}
上面就是一个简单了垂直方向的列表,Demo里面我尝试了两种给子元素设置padding的方式,padding属性的会作用在整个ListView上,单个的子元素是没有作用到的。附上一下效果截图:

水平列表组件
示例代码如下:
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart'; void main() => runApp(DemoApp()); class DemoApp extends StatelessWidget{
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'ListView Demo',
home: new ListViewDemo(),
);
}
} class ListViewDemo extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: Text('ListView Dmoe'),
leading: new Icon(Icons.menu,size: ,color: Colors.white,),
actions: <Widget>[
new IconButton(icon: Icon(Icons.search), onPressed: (){
Fluttertoast.showToast(msg: '点击了搜索按钮',toastLength: Toast.LENGTH_LONG,textColor: Colors.white,gravity: ToastGravity.BOTTOM);
})
],
),
body: Container(
height: ,
child: new ListView(
scrollDirection: Axis.horizontal,
// padding: new EdgeInsets.symmetric(vertical: 10,horizontal: 10),//给子元素设置水平和垂直方向的padding
padding: new EdgeInsets.only(left: ,top: ,right: ,bottom: ),//给子元素设置左、上、右、下的padding
children: <Widget>[
//数据源
Container(
width: ,
color: Colors.blue,
),
Container(
width: ,
color: Colors.green,
),
Container(
width: ,
color: Colors.amberAccent,
),
Container(
width: ,
color: Colors.blueGrey,
),
],
),
),
);
}
}
效果截图如下:

长列表组件
当列表的数据非常多时,需要使用长列表,比如淘宝后台的订单列表,手机通讯录等,这些列表项数据很多,长列表也是使用ListView作为基础组件,只不过需要添加一个列表项构造器itemBuilder。Flutter的长列表组件其实相当于Android中的RecyclerView,它会自动为您回收列表元素。在创建ListView.builder时,需要传入两个参数,一个列表的初始长度,一个itemBuilder函数
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart'; void main() => runApp(DemoApp()); class DemoApp extends StatelessWidget { //初始化数据源
final List<String> items = new List<String>.generate(, (i)=>"Item $i"; @override
Widget build(BuildContext context) {
return MaterialApp(
title: '长列表组件',
debugShowCheckedModeBanner: false,
home: new Scaffold(
appBar: new AppBar(
title: Text('长列表组件'),
leading: Icon(Icons.menu,size: ,color: Colors.white,),
actions: <Widget>[
new IconButton(icon: Icon(Icons.search), onPressed: null)
],
),
body: new ListView.builder(
itemCount: items.length,
//列表构造器
itemBuilder: (context,index){
return new ListTile(
leading: Icon(Icons.add_circle),
title: new Text('${items[index]}'),
onTap: (){//给每一个item增加点击事件
Fluttertoast.showToast(
msg: '${items[index]}'+'被点击了',
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.BOTTOM,
textColor: Colors.white);
},
);
},
),
),
);
}
}

上面的代码,实现了当数据源比较多时的处理办法,而且给每一个item增加了点击事件onTap()。
Flutter学习笔记(12)--列表组件的更多相关文章
- Flutter学习笔记(11)--文本组件、图标及按钮组件
如需转载,请注明出处:Flutter学习笔记(10)--容器组件.图片组件 文本组件 文本组件(text)负责显示文本和定义显示样式,下表为text常见属性 Text组件属性及描述 属性名 类型 默认 ...
- Flutter学习笔记(15)--MaterialApp应用组件及routes路由详解
如需转载,请注明出处:Flutter学习笔记(15)--MaterialApp应用组件及routes路由详解 最近一段时间生病了,整天往医院跑,也没状态学东西了,现在是好了不少了,也该继续学习啦!!! ...
- Flutter学习笔记(16)--Scaffold脚手架、AppBar组件、BottomNavigationBar组件
如需转载,请注明出处:Flutter学习笔记(15)--MaterialApp应用组件及routes路由详解 今天的内容是Scaffold脚手架.AppBar组件.BottomNavigationBa ...
- Flutter学习笔记(9)--组件Widget
如需转载,请注明出处:Flutter学习笔记(9)--组件Widget 在Flutter中,所有的显示都是Widget,Widget是一切的基础,我们可以通过修改数据,再用setState设置数据(调 ...
- Flutter学习笔记(10)--容器组件、图片组件
如需转载,请注明出处:Flutter学习笔记(10)--容器组件.图片组件 上一篇Flutter学习笔记(9)--组件Widget我们说到了在Flutter中一个非常重要的理念"一切皆为组件 ...
- Flutter学习笔记(13)--表单组件
如需转载,请注明出处:Flutter学习笔记(13)--表单组件 表单组件是个包含表单元素的区域,表单元素允许用户输入内容,比如:文本区域,下拉表单,单选框.复选框等,常见的应用场景有:登陆.注册.输 ...
- Flutter学习笔记(18)--Drawer抽屉组件
如需转载,请注明出处:Flutter学习笔记(18)--Drawer抽屉组件 Drawer(抽屉组件)可以实现类似抽屉拉出和推入的效果,可以从侧边栏拉出导航面板.通常Drawer是和ListView组 ...
- Flutter学习笔记(21)--TextField文本框组件和Card卡片组件
如需转载,请注明出处:Flutter学习笔记(21)--TextField文本框组件和Card卡片组件 今天来学习下TextField文本框组件和Card卡片组件. 只要是应用程序就少不了交互,基本上 ...
- Flutter学习笔记(24)--SingleChildScrollView滚动组件
如需转载,请注明出处:Flutter学习笔记(23)--多 在我们实际的项目开发中,经常会遇到页面UI内容过多,导致手机一屏展示不完的情况出现,以Android为例,在Android中遇到这类情况的做 ...
随机推荐
- SYN591-B型 转速表
SYN591-B型 转速表 光电转速表数显转速表智能转速表使用说明视频链接: http://www.syn029.com/h-pd-249-0_310_44_-1.html 请将此链接复制到浏览 ...
- Prometheus 与 Grafana 集成
简介 Grafana 是一个可视化仪表盘,它拥有美观的图标和布局展示,功能齐全的仪表盘和图形编辑器,默认支持 CloudWatch.Graphite.Elasticsearch.InfluxDB.My ...
- ES6 新增声明变量的 var let const 的区别详解
var 如果使用关键字 var 声明一个变量,那么这个变量就属于当前的函数作用域,如果声明是发生在任何函数外的顶层声明,那么这个变量就属于全局作用域. let 1.let 声明的变量具有块作用域的特征 ...
- 编写loadrunner的ftp脚本(详细步骤)
大家好,主要给大家讲解编写loadrunner的ftp脚本详细步骤,及FTP函数注释,及FTP脚本两种编写方式,手动和录制.亲测 No problem!^_^ 1.首先要了解loadrunner中几个 ...
- form表单提交不刷新页面的方法
方法1:给form表单加onsubmit事件,值为return false; <form action="" method="post" onsubmi ...
- CSS中浮动的使用
CSS有两个性质 第一个是 :继承性 第二个是:层叠性: 选择器的一种选择能力,谁的权重大就选谁 { 里面分两种情况: 分别是 选中和没选中. 1.选不中的情况下,走继承性,(font,color,t ...
- jenkins获取GitLab的hook数据并处理
jenkins获取GitLab的hook数据并处理 jenkins安装Generic Webhook Trigger Plugin插件 {% asset_img Generic_Webhook_Trg ...
- ubuntu镜像快速下载
由于官网服务器在国外,下载速度奇慢,所以我们可以利用阿里云镜像下载ubuntu ubuntu 14.04: http://mirrors.aliyun.com/ubuntu-releases/14.0 ...
- 关于火狐浏览器设置cookie的一个问题
最近发现我一个项目的网页,里面的cookie无法添加了,急的我瞪着我的PHP代码沉思了好久,我默认用的火狐浏览器,然而我默默的打开另一个叫360的浏览器,发现它的cookie是正常添加的. ... 难 ...
- 浅谈Invoke 和 BegionInvoke的用法
很多人对Invoke和BeginInvoke理解不深刻,不知道该怎么应用,在这篇博文里将详细阐述Invoke和BeginInvoke的用法: 首先说下Invoke和BeginInvoke有两种用法: ...