博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Flutter学习笔记(12)--列表组件
阅读量:5360 次
发布时间:2019-06-15

本文共 5829 字,大约阅读时间需要 19 分钟。

如需转载,请注明出处:

 在日常的产品项目需求中,经常会有列表展示类的需求,在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: 40,color: Colors.white,),        actions: 
[ 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: 10,top: 0,right: 10,bottom: 0),//给子元素设置左、上、右、下的padding children:
[ //数据源 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: 40,color: Colors.white,),        actions: 
[ new IconButton(icon: Icon(Icons.search), onPressed: (){ Fluttertoast.showToast(msg: '点击了搜索按钮',toastLength: Toast.LENGTH_LONG,textColor: Colors.white,gravity: ToastGravity.BOTTOM); }) ], ), body: Container( height: 100, child: new ListView( scrollDirection: Axis.horizontal,// padding: new EdgeInsets.symmetric(vertical: 10,horizontal: 10),//给子元素设置水平和垂直方向的padding padding: new EdgeInsets.only(left: 10,top: 0,right: 10,bottom: 0),//给子元素设置左、上、右、下的padding children:
[ //数据源 Container( width: 50, color: Colors.blue, ), Container( width: 50, color: Colors.green, ), Container( width: 50, color: Colors.amberAccent, ), Container( width: 50, 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
items = new List
.generate(200, (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: 30,color: Colors.white,), actions:
[ 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()。

 

下一章节:

 

转载于:https://www.cnblogs.com/upwgh/p/11261682.html

你可能感兴趣的文章
spring注入Properties
查看>>
jmeter(五)创建web测试计划
查看>>
python基本数据类型
查看>>
1305: [CQOI2009]dance跳舞 - BZOJ
查看>>
将html代码中的大写标签转换成小写标签
查看>>
jmeter多线程组间的参数传递
查看>>
零散笔记
查看>>
信息浏览器从Android的浏览器中传递cookie数据到App中信息浏览器
查看>>
hash储存机制
查看>>
HI3531uboot开机画面 分类: arm-linux-Ubunt...
查看>>
制作U盘启动CDLinux 分类: 生活百科 ...
查看>>
strcpy函数里的小九九
查看>>
搭建ssm过程中遇到的问题集
查看>>
OpenLayers绘制图形
查看>>
tp5集合h5 wap和公众号支付
查看>>
Flutter学习笔记(一)
查看>>
iOS10 国行iPhone联网权限问题处理
查看>>
洛谷 P1991 无线通讯网
查看>>
Codeforces Round #178 (Div. 2) B. Shaass and Bookshelf 【动态规划】0-1背包
查看>>
SparkStreaming 源码分析
查看>>