网易首页 > 网易号 > 正文 申请入驻

flutter系列之:flutter中listview的高级用法

0
分享至

简介

一般情况下,我们使用Listview的方式是构建要展示的item,然后将这些item传入ListView的构造函数即可,通常情况下这样做是够用了,但是不排除我们会有一些其他的特殊需求。

今天我们会来讲解一下ListView的一些高级用法。

ListView的常规用法

ListView的常规用法就是直接使用ListView的构造函数来构造ListView中的各个item。

其中ListView有一个children属性,它接收一个widget的list,这个list就是ListView中要呈现的对象。

我们来构造一个拥有100个item的ListView对象:

class CommonListViewApp extends StatelessWidget{
const CommonListViewApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return ListView(
children: List.generate(100, (i) => Text('列表 $i')),

上面的例子中,我们简单的使用List.generate方法生成了100个对象。

在item数目比较少的情况下是没有任何问题的,如果item数目比较多的情况下,直接将所有的item都取出来放在ListView中就不太现实了。

幸好,ListView还提供了一个ListView.builder的方法,这个方法会按需进行item的创建,所以在item数目比较多的情况下是非常好用的。

还是上面的例子,这次我们要生成10000个item对象,然后将这些对象放在ListView中去,应该如何处理呢?

因为这次我们要使用builder,所以没有必要在item生成的时候就创建好widget,我们可以将widget的创建放在ListView的builder中。

首先,我们构建一个items list,并将其传入MyApp的StatelessWidget中:

MyApp(
items: List.generate(10000, (i) => '列表 $i'),

然后就可以在MyApp的body中使用ListView.builder来构建item了:

body: ListView.builder(
itemCount: items.length,
prototypeItem: ListTile(
title: Text(items.first),
),
itemBuilder: (context, index) {
return ListTile(
title: Text(items[index]),
},

ListView.builder是推荐用来创建ListView的方式,上面的完整代码如下:

import 'package:flutter/material.dart';

void main() {
runApp(
MyApp(
items: List.generate(10000, (i) => '列表 $i'),
),
);
}

class MyApp extends StatelessWidget {
final List items;

const MyApp({Key? key, required this.items}) : super(key: key);

@override
Widget build(BuildContext context) {
const title = 'ListView的使用';

return MaterialApp(
title: title,
home: Scaffold(
appBar: AppBar(
title: const Text(title),
),
body: ListView.builder(
itemCount: items.length,
prototypeItem: ListTile(
title: Text(items.first),
),
itemBuilder: (context, index) {
return ListTile(
title: Text(items[index]),
);
},
),
),
);
}
}

创建不同类型的items

看到这里,可能有同学会问了,ListView中是不是只能创建一种item类型呢?答案当然是否定的。

不管是从ListView的构造函数构建还是从ListView.builder构建,我们都可以自由的创建不同类型的item。

当然最好的办法就是使用ListView.builder,根据传入的index的不同来创建不同的item。

还是上面的例子,我们可以在创建items数组的时候就根据i的不同来生成不同的item类型,也可以如下所示,在itemBuilder中根据index的不同来返回不同的item:

body: ListView.builder(
itemCount: items.length,
prototypeItem: ListTile(
title: Text(items.first),
),
itemBuilder: (context, index) {
if(index %2 == 0) {
return ListTile(
title: Text(items[index]),
}else{
return Text(items[index]);
},

非常的方便。

创建不同item的完整代码如下:

import 'package:flutter/material.dart';

void main() {
runApp(
MyApp(
items: List.generate(10000, (i) => '列表 $i'),
),
);
}

class MyApp extends StatelessWidget {
final List items;

const MyApp({Key? key, required this.items}) : super(key: key);

@override
Widget build(BuildContext context) {
const title = 'ListView的使用';

return MaterialApp(
title: title,
home: Scaffold(
appBar: AppBar(
title: const Text(title),
),
body: ListView.builder(
itemCount: items.length,
prototypeItem: ListTile(
title: Text(items.first),
),
itemBuilder: (context, index) {
if(index %2 == 0) {
return ListTile(
title: Text(items[index]),
);
}else{
return Text(items[index]);
}
},
),
),
);
}
}

总结

ListView是我们在应用中会经常用到的一种widget,希望大家能够灵活掌握。

本文的例子:https://github.com/ddean2009/learn-flutter.git

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
曼联6000万先生或变废为宝!阿莫林点名重用,两优点可成制胜武器

曼联6000万先生或变废为宝!阿莫林点名重用,两优点可成制胜武器

罗米的曼联博客
2024-12-01 08:51:42
彻底摊牌了!郭台铭做梦也没料到,中国市场赏饭吃的时代结束了

彻底摊牌了!郭台铭做梦也没料到,中国市场赏饭吃的时代结束了

九哥聊军事
2024-11-29 21:21:13
心酸!吴柳芳当网红原因找到了,拖欠工资+恋爱不顺!直言命不好

心酸!吴柳芳当网红原因找到了,拖欠工资+恋爱不顺!直言命不好

球童无忌
2024-11-30 20:15:25
万分紧急!俄罗斯行动了!

万分紧急!俄罗斯行动了!

大嘴说天下
2024-11-30 22:03:17
最新战报!11冠王冲赛点失败,第7局仅1分,霍金斯单杆57分,3-4

最新战报!11冠王冲赛点失败,第7局仅1分,霍金斯单杆57分,3-4

刘姚尧的文字城堡
2024-12-01 07:17:19
人民币汇率“升值”,12月1日,A股市场或迎来“反弹”?

人民币汇率“升值”,12月1日,A股市场或迎来“反弹”?

风口招财猪
2024-12-01 01:10:03
央妈降准、降息来了!12月1日,下周A股还将继续上涨?

央妈降准、降息来了!12月1日,下周A股还将继续上涨?

风口招财猪
2024-12-01 00:54:12
约克:我在曼联第一年进29球,第二年进26球后弗格森说我是失败者

约克:我在曼联第一年进29球,第二年进26球后弗格森说我是失败者

直播吧
2024-11-30 22:44:23
22+11+11!历史第一,火箭交易果然赌赢了,逐个爆发,轮流当基石

22+11+11!历史第一,火箭交易果然赌赢了,逐个爆发,轮流当基石

康泳哥看体育
2024-11-30 18:28:51
突发!台湾地震,多地有震感

突发!台湾地震,多地有震感

环球网资讯
2024-12-01 11:27:03
女子抛弃丈夫,出轨大17岁菜市场秃头老板,如今没人要在娘家啃老

女子抛弃丈夫,出轨大17岁菜市场秃头老板,如今没人要在娘家啃老

华人星光
2024-11-30 12:07:50
快速出手!巴基斯坦看傻眼,俾路支彻底完了!

快速出手!巴基斯坦看傻眼,俾路支彻底完了!

星辰故事屋
2024-11-30 14:16:39
上海市民反映金山出行不便,铁路可否改地铁化运营?回应来了

上海市民反映金山出行不便,铁路可否改地铁化运营?回应来了

澎湃新闻
2024-12-01 08:56:27
形势到底有多严峻?天呢!上海已经刷新国人的认知…

形势到底有多严峻?天呢!上海已经刷新国人的认知…

慧翔百科
2024-11-21 12:03:47
老伴去世后,我把房子过户给儿子,女儿消失不见,五年后被迫独居

老伴去世后,我把房子过户给儿子,女儿消失不见,五年后被迫独居

秋雅聊爱情
2024-11-30 16:32:01
Twins演唱会大翻车!阿娇胖得扭不动屁股,服装就像夜店小妹

Twins演唱会大翻车!阿娇胖得扭不动屁股,服装就像夜店小妹

南城无双
2024-11-28 21:25:50
休媒盼火箭交易得到爱德华兹:模拟7换1方案 申京+华子造全新首发

休媒盼火箭交易得到爱德华兹:模拟7换1方案 申京+华子造全新首发

颜小白的篮球梦
2024-11-30 22:30:11
KG:威少是现在掘金唯一的领袖 约基奇和穆雷必须说点什么

KG:威少是现在掘金唯一的领袖 约基奇和穆雷必须说点什么

直播吧
2024-11-30 14:56:08
巴拉圭外长提出愿跟中国建交,但有一个前提条件,中方早有言在先

巴拉圭外长提出愿跟中国建交,但有一个前提条件,中方早有言在先

圈里的甜橙子
2024-11-30 23:52:07
得到证实!OPPO杭州全球总部停工了,手机市场份额被挤出国内前5

得到证实!OPPO杭州全球总部停工了,手机市场份额被挤出国内前5

小柱解说游戏
2024-12-01 10:38:44
2024-12-01 12:07:00
flydean程序那些事
flydean程序那些事
最通俗的解读,最深刻的干货!
356文章数 438关注度
往期回顾 全部

科技要闻

我国首个商业航天发射场首发成功

头条要闻

深夜3分钟3人报警其中1个从美国打来 指向同一个地址

头条要闻

深夜3分钟3人报警其中1个从美国打来 指向同一个地址

体育要闻

两翼齐废,凯恩受伤,还好拜仁有他!

娱乐要闻

鹿晗直播回应被骂:不管怎么骂都开心

财经要闻

女首富,死刑!交出800亿,免死!

汽车要闻

科技是中国豪车梦的支点 腾势Z9走心试驾体验

态度原创

旅游
数码
艺术
房产
公开课

旅游要闻

+现场|黄浦江首艘演艺主题游船开航

数码要闻

埃隆·马斯克认可苹果 AirPods Pro 2 助听器功能 称其"够酷"

艺术要闻

故宫珍藏的墨迹《十七帖》,比拓本更精良,这才是地道的魏晋写法

房产要闻

大量甩地!114亿,4790亩!海南土地市场全面爆发!

公开课

一块玻璃,如何改变人类世界?

无障碍浏览 进入关怀版