如需转载,请注明出处:Flutter学习笔记(12)--列表组件

在日常的产品项目需求中,经常会有列表展示类的需求,在Android中常用的做法是收集数据源,然后创建列表适配器Adapter,将数据源传递到Adapter中,最终进行列表数据的展示,那么在Flutter中如何处理列表数据呢?

在Flutter中,用ListView来显示列表项,其支持垂直和水平方向展示,通过过一个属性我们就可以控制其方向,列表有以下分类:

  1.水平的列表

  2.垂直的列表

  3.数据量非常大的列表

  4.矩阵式的列表

  • 垂直列表组件

ListView组件属性及描述
属性名 类型 默认值 说明
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学习笔记(13)--表单组件

Flutter学习笔记(12)--列表组件的更多相关文章

  1. Flutter学习笔记(11)--文本组件、图标及按钮组件

    如需转载,请注明出处:Flutter学习笔记(10)--容器组件.图片组件 文本组件 文本组件(text)负责显示文本和定义显示样式,下表为text常见属性 Text组件属性及描述 属性名 类型 默认 ...

  2. Flutter学习笔记(15)--MaterialApp应用组件及routes路由详解

    如需转载,请注明出处:Flutter学习笔记(15)--MaterialApp应用组件及routes路由详解 最近一段时间生病了,整天往医院跑,也没状态学东西了,现在是好了不少了,也该继续学习啦!!! ...

  3. Flutter学习笔记(16)--Scaffold脚手架、AppBar组件、BottomNavigationBar组件

    如需转载,请注明出处:Flutter学习笔记(15)--MaterialApp应用组件及routes路由详解 今天的内容是Scaffold脚手架.AppBar组件.BottomNavigationBa ...

  4. Flutter学习笔记(9)--组件Widget

    如需转载,请注明出处:Flutter学习笔记(9)--组件Widget 在Flutter中,所有的显示都是Widget,Widget是一切的基础,我们可以通过修改数据,再用setState设置数据(调 ...

  5. Flutter学习笔记(10)--容器组件、图片组件

    如需转载,请注明出处:Flutter学习笔记(10)--容器组件.图片组件 上一篇Flutter学习笔记(9)--组件Widget我们说到了在Flutter中一个非常重要的理念"一切皆为组件 ...

  6. Flutter学习笔记(13)--表单组件

    如需转载,请注明出处:Flutter学习笔记(13)--表单组件 表单组件是个包含表单元素的区域,表单元素允许用户输入内容,比如:文本区域,下拉表单,单选框.复选框等,常见的应用场景有:登陆.注册.输 ...

  7. Flutter学习笔记(18)--Drawer抽屉组件

    如需转载,请注明出处:Flutter学习笔记(18)--Drawer抽屉组件 Drawer(抽屉组件)可以实现类似抽屉拉出和推入的效果,可以从侧边栏拉出导航面板.通常Drawer是和ListView组 ...

  8. Flutter学习笔记(21)--TextField文本框组件和Card卡片组件

    如需转载,请注明出处:Flutter学习笔记(21)--TextField文本框组件和Card卡片组件 今天来学习下TextField文本框组件和Card卡片组件. 只要是应用程序就少不了交互,基本上 ...

  9. Flutter学习笔记(24)--SingleChildScrollView滚动组件

    如需转载,请注明出处:Flutter学习笔记(23)--多 在我们实际的项目开发中,经常会遇到页面UI内容过多,导致手机一屏展示不完的情况出现,以Android为例,在Android中遇到这类情况的做 ...

随机推荐

  1. gitlab安装笔记一_虚拟机中安装Centos7

    (为搭建gitlab环境的准备) 环境:vmware workstation 12 pro 系统: CentOS-7-x86_64-Everything-1804.iso  (CentOS-7-Min ...

  2. Hadoop编程踩坑

    Hadoop踩坑 在hadoop所有组件编程中,遇到在Windows下运行程序出现 java.io.IOException: Could not locate executable null\bin\ ...

  3. PWN菜鸡入门之栈溢出(1)

    栈溢出 一.基本概念: 函数调用栈情况见链接 基本准备: bss段可执行检测: ​ gef➤ b main Breakpoint at . gef➤ r Starting program: /mnt/ ...

  4. angular2最详细的开发环境搭建过程

    本文所需要的源代码,从 http://files.cnblogs.com/files/lingzhihua/angular2-quickstart.rar 下载 angular官方推荐使用quicks ...

  5. 【安装】Hadoop2.8.0搭建过程整理版

    Hadoop搭建过程 前期环境搭建主要分为软件的安装与配置文件的配置,集成的东西越多,配置项也就越复杂. Hadoop集成了一个动物园,所以配置项也比较多,且每个版本之间会有少许差异. 安装的方式有很 ...

  6. Codeforces Round #568 (Div. 2)A

    A. Ropewalkers 题目链接:http://codeforces.com/contest/1185/problem/A 题目: Polycarp decided to relax on hi ...

  7. spring源码深度解析— IOC 之 开启 bean 的加载

    概述 前面我们已经分析了spring对于xml配置文件的解析,将分析的信息组装成 BeanDefinition,并将其保存注册到相应的 BeanDefinitionRegistry 中.至此,Spri ...

  8. 【Linux】一步一步学Linux——VMware虚拟机三种网络模式详解(07)

    目录 00. 目录 01. 虚拟网络连接组件 02. 常见网络连接配置 03. 桥接模式 04. NAT 模式 05. 仅主机模式 06. 自定义模式 07. 附录 00. 目录 @ 01. 虚拟网络 ...

  9. 【无线安全实践入门】网络扫描和ARP欺骗

    文中可能存在错误操作或错误理解,望大家不吝指正. 同时也希望可以帮助到想要学习接触此方面.或兴趣使然的你,让你有个大概的印象. !阅前须知! 本文是基于我几年前的一本笔记本,上面记录了我学习网络基础时 ...

  10. 百度云下载神器 速盘SpeedPan v1.9.7

    速盘 – 不一样的度盘神器!SpeedPan 是一款由吾爱破解论坛会员"菩提叶"制作的度盘满速下载工具.这款百度网盘高速下载工具,免费小巧简单易用,采用了Aria2多线程下载,支持 ...