前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ListView&GirdView

ListView&GirdView

作者头像
flyou
发布于 2019-08-06 09:08:05
发布于 2019-08-06 09:08:05
1.8K00
代码可运行
举报
文章被收录于专栏:flutter开发者flutter开发者
运行总次数:0
代码可运行

在前面的的文章中我们了解了Flutter中操作提示的用法,包括SnackBar、Dialog、以及BottomSheet,通过这些Widget我们可以很方便的实现对应用操作的提示。

在本篇文章中,我们会进一步对Flutter中常用的Widget进行介绍,有印象的童鞋可能还记得,在前面的文章中我们分享了Row和Colunm的用法,我们也使用这两个Widget完成了一些类似列表的操作,但是大家肯定也知道,如果在数据量还小的页面还好,如果数据量过多,再使用这两个控件来布局就会显得十分的麻烦。 那么我们今天就来介绍下Flutter中的列表组件ListView和网格组件GirdView,嗯,果然是Google家的亲儿子,连名字都和Android里的一模一样。 好的吧,我们还是来看下这两个Widget的用法吧

ListView


ListView就是我们常见的列表组件,在平时的应用开发中十分的常见,无论你做的是什么类型的应用都会多多少少会用到ListView,所以要好好看下这篇文章哦

还是先来看下listView的构造方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ListView({
Key key,
Axis scrollDirection: Axis.vertical,//滚动方向
bool reverse: false,//十分反向显示数据
ScrollController controller,
bool primary,
ScrollPhysics physics,//物理滚动
bool shrinkWrap: false,
EdgeInsetsGeometry padding,
this.itemExtent,//item有效范围
bool addAutomaticKeepAlives: true,//自动保存视图缓存
bool addRepaintBoundaries: true,//添加重绘边界
List<Widget> children: const <Widget>[],
})

那么,我们还是来看下具体的用法

我们还是按照惯例在Scaffold里放一个ListView

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'package:flutter/material.dart';

void main() {
  runApp(
    new MaterialApp(home: new MyApp()),
  );
}

class MyApp extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text("ListView"),
      ),
      body: new ListView(
        children: <Widget>[
          new ListTile(
            leading: new Icon(
              Icons.cake,
            ),
            title: new Text("我是标题"),
          ), new ListTile(
            leading: new Icon(
              Icons.android,
            ),
            title: new Text("我是标题"),
          ), new ListTile(
            leading: new Icon(
              Icons.apps,
            ),
            title: new Text("我是标题"),
          ), new ListTile(
            leading: new Icon(
              Icons.account_circle,
            ),
            title: new Text("我是标题"),
          )
        ],
      ),
    );
  }
}

children参数我们传入了4个lsitTitle,来看下效果

当然,由于数据量过少它现在是不能滑动的。大家可以在下面多加几个Widget试试效果。

在Flutter中有三种构建ListView的方式,刚才介绍的是最简单的一种,但是却不是最常用的,因为它仅仅适用于已知数量或者较少数量的Item的情况。如果有未知数量或者无限个Item的情况,再使用上述的方法将不再适用。

那么,我们可以尝试下ListView.builder()和ListView.custom()。

ListView.builder()和ListView.custom()的用法基本相同,只不过custom可以根据自己的需要控制Item显示方式,如Item显示大小。

我们今天来看下ListView.builder()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ListView.builder({
Key key,
Axis scrollDirection: Axis.vertical,
bool reverse: false,
ScrollController controller,
bool primary,
ScrollPhysics physics,
bool shrinkWrap: false,
EdgeInsetsGeometry padding,
this.itemExtent,
@required IndexedWidgetBuilder itemBuilder,//item构建者
int itemCount,//item数量
bool addAutomaticKeepAlives: true,
bool addRepaintBoundaries: true,
})

相比于new ListView()只不过多出了两个参数而已,一个是itemCount指定item的数量,一个是itemBuilder,用来构建Item。

看下用法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'package:flutter/material.dart';

void main() {
  runApp(new MaterialApp(
    home: new MyApp(),
  ));
}

class MyApp extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return new MyAppState();
  }
}

class MyAppState extends State<MyApp> {
  final List<ListItem> listData = [];

  @override
  void initState() {
    super.initState();
    for (int i = 0; i < 20; i++) {
      listData.add(new ListItem("我是测试标题$i", Icons.cake));
    }
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text("ListView"),
      ),
      body: new ListView.builder(
        itemBuilder: (BuildContext context, int index) {
          return new ListItemWidget(listData[index]);
        },
        itemCount: listData.length,
      ),
    );
  }
}

class ListItem {
  final String title;
  final IconData iconData;

  ListItem(this.title, this.iconData);
}

class ListItemWidget extends StatelessWidget {
  final ListItem listItem;

  ListItemWidget(this.listItem);

  @override
  Widget build(BuildContext context) {
    return new ListTile(
      leading: new Icon(listItem.iconData),
      title: new Text(listItem.title),
    );
  }
}

我们首先新建了一个ListItem对象,icon和title两个属性 然后在initState方法中初始化listData,创建了20个ListItem对象。

我们新建了一个一个Widget,需要传入ListItem对象,借助于ListItem对象的属性初始化ListTitle。

在itemBuilder中返回指定的的Listitem到ListItemWidget对象中,返回指定的ListItemWidget对象。

通过这种方法,我们不需要关注Item的数量,因为我们每个Item都是自动构建的,并且大大减少重复代码的数量。

其实也是非常简单的,因为很多东西我们在之前的文章中都多少提过。

下面来看下GridView

GridView


GirView的用法和ListView类似,只不过由于GridView可以在一列或者一行显示多个Item,所以在构造方法中就多了个参

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GridView({
Key key,
Axis scrollDirection: Axis.vertical,
bool reverse: false,
ScrollController controller,
bool primary,
ScrollPhysics physics,
bool shrinkWrap: false,
EdgeInsetsGeometry padding,
@required this.gridDelegate,//没错,它就是控制GridView的
bool addAutomaticKeepAlives: true,
bool addRepaintBoundaries: true,
List<Widget> children: const <Widget>[],
})

看下gridDelegate参数

可以传入SliverGridDelegateWithFixedCrossAxisCount对象和SliverGridDelegateWithMaxCrossAxisExtent对象。

其中SliverGridDelegateWithFixedCrossAxisCount可以直接指定每行(列)显示多少个Item,SliverGridDelegateWithMaxCrossAxisExtent会根据GridView的宽度和你设置的每个的宽度来自动计算没行显示多少个Item

国际惯例,我们还是只介绍一个,那就SliverGridDelegateWithFixedCrossAxisCount吧。

看下代码,怎么用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'package:flutter/material.dart';

void main() {
  runApp(
    new MaterialApp(home: new MyApp()),
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text("GridView"),
      ),
      body: new GridView(
        children: <Widget>[
          new Container(
            child: new Icon(
              Icons.cake,
              size: 50.0,
            ),
            color: Colors.blue,
          ),
          new Container(

            child: new Icon(
              Icons.cake,
              size: 50.0,
            ),
            color: Colors.blue,
          ),new Container(
            child: new Icon(
              Icons.cake,
              size: 50.0,
            ),
            color: Colors.blue,
          ),new Container(
            child: new Icon(
              Icons.cake,
              size: 50.0,
            ),
            color: Colors.blue,
          ),new Container(
            child: new Icon(
              Icons.cake,
              size: 50.0,
            ),
            color: Colors.blue,
          ),new Container(
            child: new Icon(
              Icons.cake,
              size: 50.0,
            ),
            color: Colors.blue,
          ),new Container(
            child: new Icon(
              Icons.cake,
              size: 50.0,
            ),
            color: Colors.blue,
          ),new Container(
            child: new Icon(
              Icons.cake,
              size: 50.0,
            ),
            color: Colors.blue,
          ),new Container(
            child: new Icon(
              Icons.cake,
              size: 50.0,
            ),
            color: Colors.blue,
          ),new Container(
            child: new Icon(
              Icons.cake,
              size: 50.0,
            ),
            color: Colors.blue,
          ),
        ],
        reverse: false,
        gridDelegate: new SliverGridDelegateWithFixedCrossAxisCount(
            crossAxisCount: 2,
            mainAxisSpacing: 10.0,
            crossAxisSpacing: 10.0,
            childAspectRatio: 1.0),
      ),
    );
  }
}

和ListView类似,我们在GridView的children中新增了10个Icon并给它设置背景并居中,另外我们根据gridDelegate属性设置每行显示2个Item,并且设置Item间隔为10像素。

效果如下:

当然,GridView你也可以使用builder()和custom()的方式实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'package:flutter/material.dart';

void main() {
  runApp(new MaterialApp(
    home: new MyApp(),
  ));
}

class MyApp extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return new MyAppState();
  }
}

class MyAppState extends State<MyApp> {
  final List<ListItem> listData = [];

  @override
  void initState() {
    super.initState();
    for (int i = 0; i < 20; i++) {
      listData.add(new ListItem("我是测试标题$i", Icons.cake));
    }
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text("ListView"),
      ),
      body: new GridView.builder(
        gridDelegate: new SliverGridDelegateWithFixedCrossAxisCount(
            crossAxisCount: 2,
            mainAxisSpacing: 10.0,
            crossAxisSpacing: 10.0,
            childAspectRatio: 1.0),
        itemBuilder: (BuildContext context, int index) {
          return new ListItemWidget(listData[index]);
        },
        itemCount: listData.length,
      ),
    );
  }
}

class ListItem {
  final String title;
  final IconData iconData;

  ListItem(this.title, this.iconData);
}

class ListItemWidget extends StatelessWidget {
  final ListItem listItem;

  ListItemWidget(this.listItem);

  @override
  Widget build(BuildContext context) {
    return new GestureDetector(
      child: new Container(
        color: Colors.blue,
        child: new Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            new Icon(listItem.iconData, size: 50.0),
            new Text(listItem.title)
          ],
        ),
      ),
      onTap: () {
        Scaffold.of(context).showSnackBar(new SnackBar(
          content: new Text(listItem.title),
        ));
      },
    );
  }
}

和上面ListView的用类似,只不过我们现在是一行显示多个Item而已。并且我们给每个Item设置上了点击事件,每次点击Item就会弹出相应的标题。

小结


  • ListView就是我们常用的列表视图
  • GridView就是我们常用的宫格视图
  • ListView和GridView都可以使用new 或者builder()和custom()方法来创建对象

我怀疑这个是个坏掉的二维码,分享到朋友圈试试?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-03-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 flutter开发者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
《CodeBuddy:像哆啦A梦一样智能的编程助手》
我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴
Lethehong
2025/05/11
2660
《CodeBuddy:像哆啦A梦一样智能的编程助手》
从代码到心灵对话:我的CodeBuddy升级体验之旅(个性化推荐微服务系统)
我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴
Lethehong
2025/05/02
1982
从代码到心灵对话:我的CodeBuddy升级体验之旅(个性化推荐微服务系统)
6 款 AI 工具,助力写出更优质代码
在这个节奏飞快的时代,程序员们总是在寻找提升工作效率和简化工作流程的途径。得益于人工智能(AI)技术的飞速进步,如今程序员们有了众多 AI 辅助工具可供使用,这些工具能让编程工作变得更加迅速、简便和高效。
数据科学工厂
2025/02/08
2.4K0
6 款 AI 工具,助力写出更优质代码
自从用了这个插件写代码速度提升了十倍,居然还同时支持 JetBrains 全家桶和 VS Code!
在科技浪潮的汹涌澎湃中,人类社会正以前所未有的速度步入一个全新的 AI(人工智能)时代。随着大数据、云计算、深度学习等技术的飞速发展,AI 不再仅仅是科幻电影中的桥段,它已悄然渗透到我们日常的每一个角落。
一个正经的程序员
2024/08/08
2030
自从用了这个插件写代码速度提升了十倍,居然还同时支持 JetBrains 全家桶和 VS Code!
10.4K Star厉害!支持14种IDE的代码补全神器
开源日记
2024/05/06
2610
10.4K Star厉害!支持14种IDE的代码补全神器
程序员不能不知道的13个AI开发工具
随着人工智能的进步,开发行业已经发展到了新的水平。 目前,人工智能工具在开发者中很受欢迎,因为它正在迅速重塑开发行业。
从大数据到人工智能
2023/10/18
5.3K0
程序员不能不知道的13个AI开发工具
人工智能助你编程更轻松!程序员必备的编程助手
平时我们写代码的时候都会依赖编辑器里面的代码补全这个功能,敲几个字母就能补全一整个词。可是这么多年过去了,代码补全却还是最开始那样,只限定于一个词,且毫无意义地按照字典表顺序排列。
好好学java
2019/09/03
9060
人工智能助你编程更轻松!程序员必备的编程助手
AI编程工具合集
在当今快速发展的技术时代,人工智能(AI)已经成为软件开发领域中不可或缺的一部分。AI编程不仅仅是一种技术趋势,它已经彻底改变了我们设计和实现软件的方式。从自动化的数据分析到智能的用户交互,AI编程正在推动着软件开发的边界,使其更加高效、智能和个性化。
正在走向自律
2024/12/18
2910
AI编程工具合集
智能编程新纪元:腾讯AI代码助手的高效编程体验
Al代码助手的概念源于人工智能领域,它代表了一系列能够理解、学习并执行任务的智能软件或硬件系统。它们的设计初衷是简化人们的日常生活和提高程序员工作效率,同时为用户提供个性化、智能化的服务体验。
用户11203107
2024/08/08
3790
智能编程新纪元:腾讯AI代码助手的高效编程体验
腾讯云AI代码助手测评,智能编程助手,让代码创作更简单高效
在当今快节奏的软件开发环境中,提高编码效率和代码质量成为了每个开发者追求的目标。腾讯云AI代码助手作为一款基于混元代码大模型的智能编码工具,引起了广泛关注。腾讯云 AI 代码助手是一款定位代码智能补全和生成的工具,基于自研代码大模型,实现技术沟通、代码补全、自动补全单元测试等功能。本文将通过实际使用体验,对腾讯云AI代码助手进行详细测评。
李洋博客
2024/08/19
1.6K0
腾讯云AI代码助手测评,智能编程助手,让代码创作更简单高效
2024年值得你关注的9款AI工具,提升你的编码效率
随着2024年的到来,这是一个绝佳的机会来回顾一下那些对开发者们极为有用的人工智能(AI)工具。这些工具可以帮助我们在新的一年中提升开发流程。
前端达人
2024/01/03
2.3K0
2024年值得你关注的9款AI工具,提升你的编码效率
搞对象了
腾讯云 AI 代码助手是一款革命性的编码辅助工具,它在程序员编写代码时发挥着至关重要的作用——预测并提供下一句或下一段代码的建议。你可能会疑惑,既然 IDE 已经具备基本的代码补全功能,为何还需要 AI 代码助手呢?这里的关键在于 AI 代码助手能够深入理解代码的上下文环境,提供逻辑和语法上更加精准的代码补全建议,这超越了传统基于关键词匹配的补全方式。更进一步,AI 代码助手能够学习并适应程序员的编码风格和历史代码模式,从而提供定制化的代码补全,使得编写的代码更加贴合个人习惯。
腾讯云开发者
2024/12/10
1040
搞对象了
腾讯云AI代码助手:智能编程的新篇章,大家的代码开发伙伴
随着人工智能技术的飞速发展,其在各个领域的应用也日益广泛。编程作为技术领域的核心,自然也迎来了AI的助力。陆陆续续的AI代码助手已向我们走来,像 github(也就是微软)发布github copilot,通义千问以及腾讯推出的腾讯云AI代码助手在帮助程序员进行代码开发方面都已取得了较大的成功。
可知春风过
2024/08/12
5320
腾讯云AI代码助手:智能编程的新篇章,大家的代码开发伙伴
从免费安装到上手项目,打造你的 CodeBuddy 高效开发教程
大家好,“我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴”
用户3171739
2025/05/10
2702
从免费安装到上手项目,打造你的 CodeBuddy 高效开发教程
腾讯云AI代码助手 —— 编程新体验,智能编码新纪元
在数字化转型的浪潮中,软件开发与编程已经成为推动各行各业创新与发展的重要引擎。然而,随着项目规模的扩大和复杂度的提升,开发者们面临着前所未有的挑战:如何在保证代码质量的同时,提高开发效率,快速响应市场变化?为了解答这一难题,腾讯云凭借其深厚的技术积累与创新能力,推出了AI代码助手——一款辅助编码工具,基于混元代码大模型,提供技术对话、代码补全、代码诊断和优化等能力。
用户11240483
2024/08/12
3450
腾讯云AI代码助手 —— 编程新体验,智能编码新纪元
ChatGPT对未来编程语言发展的影响与展望
ChatGPT是一种基于自然语言处理技术的语言模型,由美国OpenAI团队研发。它是构建在生成式预训练变换模型(Generative Pre-trained Transformer,简称GPT)之上,具有强大的自然语言理解和生成能力。GPT模型以大规模文本数据为输入进行训练,从而学习到了丰富的语言知识和语义理解能力。它可以根据聊天的上下文生成自然、流畅、有逻辑的回复,并能进行多轮对话。 ChatGPT是一种通用的,生成式的人工智能。通用,说ChatGPT并不限定领域。生成式说明它的结果是生成的,而不是搜索出来的,是在理解的基础上生成的新的内容。
鲲志说
2025/04/07
1100
ChatGPT对未来编程语言发展的影响与展望
【技术前瞻】JetBrains AI Assistant 2024.3 多模型支持,AI编程助手新趋势,个性化智能助手新篇章!
JetBrains AI Assistant 2024.3 现已推出!此版本的一大亮点是可以灵活地选择您喜欢的聊天模型。
程序视点
2025/01/17
3290
【技术前瞻】JetBrains AI Assistant 2024.3 多模型支持,AI编程助手新趋势,个性化智能助手新篇章!
为你的IDE集成AI,解放双手,我推荐这款神器!
我们平时写代码的时候,多少都会依赖编辑器的代码补全功能,敲几个字母就能补全一个词。可是这么多年过去了,语言升级了很多次,而代码提示却没有升级,还是只能限定在一个词,毫无意义地按照字典表顺序排列,这对于编程来讲,又有什么价值呢?
JAVA葵花宝典
2019/07/31
6290
为你的IDE集成AI,解放双手,我推荐这款神器!
一文读懂如何基于 GenAI 提升编码效能
面对日新月异的技术创新以及差异化的业务场景挑战,传统的编码方式已经开始出现水土不服,难以完全应对日益增长的诉求。与此同时,新兴的通用 GenAI (人工智能技术)具有极具潜力来满足这一需求。
Luga Lee
2024/01/29
5730
一文读懂如何基于 GenAI 提升编码效能
腾讯云 AI 代码助手:提升编码效率与优化开发体验的必备工具
在当今快速发展的技术时代,AI逐渐成为开发者的强大助手。本文将介绍一款智能代码助手,它不仅能显著提升编程效率,还能帮助开发者更快地解决问题。通过集成先进的AI技术,该助手能够自动生成代码、优化逻辑,并提供实时建议,为开发者创造更流畅的编程体验。今天要给大家介绍的是腾讯云 Cloud Studio 中强大的功能:AI代码助手。
bluetata
2024/08/14
4050
推荐阅读
相关推荐
《CodeBuddy:像哆啦A梦一样智能的编程助手》
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档