首页 > 其他分享 >flutter系列之:flutter中listview的高级用法

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

时间:2023-01-03 17:45:40浏览次数:63  
标签:index listview title items 用法 item Text ListView flutter

目录

简介

一般情况下,我们使用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<Widget>.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<String>.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<String>.generate(10000, (i) => '列表 $i'),
    ),
  );
}

class MyApp extends StatelessWidget {
  final List<String> 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<String>.generate(10000, (i) => '列表 $i'),
    ),
  );
}

class MyApp extends StatelessWidget {
  final List<String> 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

标签:index,listview,title,items,用法,item,Text,ListView,flutter
From: https://www.cnblogs.com/flydean/p/17022966.html

相关文章

  • redis高级用法
    1高级用法之慢查询#讲5大数据类型,O(n),命令执行时间很长,redis命令操作单线程架构,阻塞-单线程架构:并发操作不需要锁-mysql:行锁,表锁,并发操作数据错乱的问题......
  • C++数据结构map中的begin()和rbegin()具体区别及erase()具体用法
    1.前言 昨天写的LeetCode打卡题,用到了map数据结构,并且需要顺序和逆序遍历map并删除key对应value为0的这个对象。本以为begin()和rbegin()是一样的迭代器,只不过是一个指......
  • Java里if和else的用法
    前言在上一篇文章中,壹哥给大家讲解了Java里的输入与输出语句,现在你知道怎么用了吗?接下来我们继续往下学习Java里的流程控制语句,今天先给大家讲一下if和else这一对好基友,......
  • 简单聊聊:Stream.reduce()用法解析
    基本使用先举一个简单的例子:算法题:Words题目描述每个句子由多个单词组成,句子中的每个单词的长度都可能不一样,我们假设每个单词的长度Ni为该单词的重量,你需要做的就是给出......
  • Flutter Gestures
    LearntohandleFluttergesturesliketap,press,longpress,drags,etc.Itisveryimportanttoknowtheactionsofuser.Gesturesarephysicalactionandmo......
  • Flutter Widgets
    LearnthebasicconceptofFlutterwidgetsanddifferentwaysofuseittomakeuserinterface.InFlutter,almosteverythingisawidget.Inthistutorial,yo......
  • Django框架:13、csrf跨站请求伪造、auth认证模块及相关用法
    Django框架目录Django框架一、csrf跨站请求伪造1、简介2、csrf校验策略form表单csrf策略ajax请求csrf策略3、csrf相关装饰器FBV添加装饰器方式CBV添加装饰器方式二、aut......
  • iView 树形组件 on-select-change 事件用法
    一、组件  <Tree:data="baseData"@on-select-change="checkBoxSel"show-checkbox></Tree>二、方法checkBoxSel(root,node){......
  • curl命令常见用法汇总 good
     ​​curl​​是一种命令行工具,作用是发出网络请求,然后得到和提取数据,显示在"标准输出"(stdout)上面。curl是一个强大的命令行工具,它可以通过网络将信息传递给服务器或者从服......
  • Django-drf-序列化器高级用法之SerializerMethodField
    在Drf框架中的serializers.py序列化中,SerializerMethodField字段是一个只读字段。它通过调用附加到的序列化程序类上的方法来获取其值。它可用于将任何类型的数据添加到对......