Flutter利用GridView创建网格布局实现优美布局

news2024/12/26 13:32:11

请添加图片描述

文章目录

  • 简介
  • 使用详解
    • 导入依赖项
    • 创建一个基本的 GridView
    • 一些参数说明
    • 使用GridView.count来构造
  • 其他控制
  • 总结

简介

GridView 是 Flutter 中用于创建网格布局的强大小部件。它允许你在行和列中排列子小部件,非常适合显示大量项目,例如图像、文本、卡片等。

使用详解

以下是关于如何使用 GridView 控件的详细讲解:

导入依赖项

在你的 Flutter 项目中,首先确保已经导入了 flutter/material.dart 包,因为 GridView 是 material 包的一部分,然后你可以使用以下代码创建一个简单的 GridView:

import 'package:flutter/material.dart';

创建一个基本的 GridView

下面是一个基本的 GridView 示例,它创建了一个包含一组简单文本小部件的网格:

GridView(
  gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
    crossAxisCount: 2, // 列数
    mainAxisSpacing: 10.0, // 垂直间距
    crossAxisSpacing: 10.0, // 水平间距
  ),
  children: <Widget>[
    Container(
      color: Colors.red,
      child: Center(child: Text('Item 1')),
    ),
    Container(
      color: Colors.green,
      child: Center(child: Text('Item 2')),
    ),
    Container(
      color: Colors.blue,
      child: Center(child: Text('Item 3')),
    ),
    // 可以继续添加更多的子小部件
  ],
)

在这个示例中,我们创建了一个包含三个列的网格(crossAxisCount: 2)。每个网格项都由一个带有不同背景颜色的 Container 包装,并且包含一个居中对齐的文本小部件。

一些参数说明

SliverGridDelegateWithFixedCrossAxisCount
gridDelegate 属性是 GridView 的一个关键部分,它用于定义网格的布局方式。在上面的示例中,我们使用了 SliverGridDelegateWithFixedCrossAxisCount,它采用以下参数:

crossAxisCount:指定了列数。
mainAxisSpacing:指定了主轴(通常是垂直轴)上的间距。
crossAxisSpacing:指定了交叉轴(通常是水平轴)上的间距。
使用 builder 构建动态网格
如果你有一个大数据源,并且不想一次性加载所有数据,你可以使用 GridView.builder,它会根据需要生成网格项。以下是一个示例:

GridView.builder(
  gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
    crossAxisCount: 2,
    mainAxisSpacing: 10.0,
    crossAxisSpacing: 10.0,
  ),
  itemCount: yourData.length, // 数据源的长度
  itemBuilder: (BuildContext context, int index) {
    return Container(
      color: Colors.blue,
      child: Center(child: Text('Item $index')),
    );
  },
)

在这个示例中,itemBuilder 函数会根据索引值生成每个网格项。你可以根据实际需求从 yourData 数据源中获取数据。

使用GridView.count来构造

GridView.count(
              crossAxisCount: 4,
              children: List.generate(snapshot.data?.length as int, (index) {
                return Center(
                  child: Padding(
                    padding: const EdgeInsets.all(6.0),
                    child: Column(
                      mainAxisAlignment: MainAxisAlignment.center,
                      children: [
                        GestureDetector(
                          onTap: () {
                            print('Button $index is pressed,${snapshot.data?[index].sptime},${snapshot.data?[index].cycle},${snapshot.data?[index].retime}');
                            // 按钮点击事件
                            AppRouter.router.navigateTo(
                              context,
                              '/DoSportsPage/${snapshot.data?[index].sptime}/${snapshot.data?[index].cycle}/${snapshot.data?[index].retime}',
                              transition: TransitionType.fadeIn,
                            );
                            // Navigator.of(context).pop();
                            // Navigator.of(context).push(MaterialPageRoute(builder: (context) => const SportsShow()));
                          },
                          //long time press button to delete data
                          onLongPress: ( ) {
                            print('Button $index is longpressed id= ${snapshot.data?[index].id}');
                            DatabaseHelper.dbhelper.delete(snapshot.data?[index].id);
                            setState(() {
                              //show again
                            });
                          },
                          child: CircleAvatar(
                            child: Text(snapshot.data?[index].title.substring(0, 1)),
                            // radius: 30,
                            // backgroundImage: AssetImage('assets/touxiang.jpg'),
                            // backgroundColor: Colors.white,
                          ),
                        ),
                        const SizedBox(height: 8),
                        Text(
                          snapshot.data![index].title,
                          style: const TextStyle(fontSize: 12),
                        ),
                      ],
                    ),
                  ),
                );
              }),
            );
          } else {
            return const CircularProgressIndicator();
          }

这段代码是使用 GridView.count 构建一个网格布局,其中 crossAxisCount 属性定义了网格的列数,而 children 属性用于指定网格中的子小部件列表。

GridView.count: 这是一个 GridView 的构造函数,用于创建一个具有固定列数的网格布局。

crossAxisCount: 这是 GridView.count 构造函数的一个参数,它指定了网格的列数。在你的示例中,crossAxisCount 设置为 4,表示该网格将包含四列。

children: 这是一个包含要在网格中显示的子小部件的列表。在你的示例中,它使用 List.generate 函数生成了一个包含 snapshot.data?.length 个元素的列表。snapshot.data?.length 是一个可能为空的数据长度,因此在此处使用 ?. 运算符以避免出现空指针异常。

List.generate 函数接受两个参数:

第一个参数是要生成的列表的长度,这里是 snapshot.data?.length。

第二个参数是一个回调函数,用于生成列表中每个元素的内容。在你的示例中,回调函数 (index) 生成了网格中每个元素的内容。

所以,这段代码的作用是创建一个包含固定列数(4列)的网格,其中每个格子的内容由 List.generate 函数生成,数量等于 snapshot.data?.length。通常,snapshot.data 包含从数据源检索到的数据,而这段代码将这些数据以网格的形式进行展示。

其他控制

在 Flutter 中,GridView 提供了各种属性和参数,以便你可以配置滚动方向、内容填充以及滚动控制。以下是一些常用的属性和参数:

滚动方向(scrollDirection):
使用 scrollDirection 属性可以设置 GridView 的滚动方向。默认情况下,它是垂直方向的,但你可以将其设置为水平方向。

GridView(
  scrollDirection: Axis.horizontal, // 设置为水平滚动
  // 其他属性...
)

内容填充(padding):
使用 padding 属性可以设置 GridView 内容的内边距。你可以在内边距中定义空白区域,以便在网格周围留出一些空间。

GridView(
  padding: EdgeInsets.all(16.0), // 设置内边距为16.0
  // 其他属性...
)

滚动控制(controller):
你可以使用 controller 属性来自定义滚动控制器,以实现更高级的滚动控制功能。例如,你可以创建一个 ScrollController 并将其传递给 GridView,以便监听滚动位置、滚动到特定位置等。

ScrollController _controller = ScrollController();

GridView(
  controller: _controller,
  // 其他属性...
)

这样,你可以使用 _controller 对象来执行滚动操作,例如:

滚动到特定位置:_controller.jumpTo(offset) 或 _controller.animateTo(offset, duration: Duration(milliseconds: 500), curve: Curves.ease)

监听滚动位置:可以添加监听器 _controller.addListener(() { /* 处理滚动位置的变化 */ })

这些属性和参数使你能够根据需求对 GridView 进行自定义和控制,以创建不同类型的滚动网格布局。

总结

GridView 持许多其他配置选项,如滚动方向、内容填充、滚动控制等。你可以根据你的应用需求进行进一步的定制。总的来说,GridView 是一个非常灵活且强大的小部件,可用于创建各种网格布局。


结束语
Flutter是一个由Google开发的开源UI工具包,它可以让您在不同平台上创建高质量、美观的应用程序,而无需编写大量平台特定的代码。我将学习和深入研究Flutter的方方面面。从基础知识到高级技巧,从UI设计到性能优化,欢饮关注一起讨论学习,共同进入Flutter的精彩世界!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1180445.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LiveMedia支持海康大华GB28181语音对讲需要的设备及服务准备

1、背景 GB28181支持国标协议的设备&#xff0c;通过GB28181注册接入到国标视频平台后。视频平台在某些情况下需要喊话摄像头&#xff0c;LiveMedia视频监控平台支持这样的国标设备语音对讲。就是可以从控制中心和您关注的设备间&#xff0c;进行语音对讲。 2、准备 2.1、准…

3D打印服务展示预约小程序的效果如何

3D打印服务的需求度非常高&#xff0c;同时还有加工、设计等&#xff0c;很多情况下商家需要推广获客及信息展示&#xff0c;而客户也需要多渠道寻找服务订购或咨询等。而在实际经营&#xff0c;3D打印服务商家也面临多个痛点&#xff1a; 1、品牌宣传拓客难 印刷包装行业除了…

用CHAT写APP的权限需求

今天我们来接触一个关于程序的问题&#xff0c;探索更多知识点 问CHAT&#xff1a;一个nuiapp开发的前端app&#xff0c;一般用户安装的时候&#xff0c;都有什么权限可以获取&#xff1f;有什么权限是牵扯隐私的&#xff1f; NUIApp&#xff08;Native User Interface App&am…

TikTok与老年用户:社交媒体的跨代交流

在数字时代&#xff0c;社交媒体已成为人们沟通、分享和互动的主要平台。然而&#xff0c;社交媒体不再仅仅局限于年轻一代&#xff0c;老年用户也逐渐加入其中。 其中&#xff0c;TikTok是一个引领潮流的短视频社交媒体应用&#xff0c;正在吸引越来越多的老年用户。本文将探…

​​Android平台GB28181历史视音频文件回放规范解读及技术实现

技术背景 在实现GB28181历史视音频文件回放之前&#xff0c;我们已完成了历史视音频文件检索和下载&#xff0c;历史视音频回放&#xff0c;在GB28181平台非常重要&#xff0c;比如执法记录仪等前端设备&#xff0c;默认录像数据存储在前端设备侧&#xff0c;如果需要上传到平…

光模块厂家如何实现千兆和万兆的大规模量产

随着网络需求的不断增长&#xff0c;千兆光模块和万兆光模块成为了网络通信中不可或缺的组件。但是&#xff0c;如何实现这些高速光模块的量产却是厂家们面临的难题。本文将介绍千兆光模块和万兆光模块的生产工艺差异和技术挑战&#xff0c;并探讨厂家如何实现千兆和万兆的大规…

JWT简介 JWT结构 JWT示例 前端添加JWT令牌功能 后端程序

目录 1. JWT简述 1.1 什么是JWT 1.2 为什么使用JWT 1.3 JWT结构 1.4 验证过程 2. JWT示例 2.1 后台程序 2.2 前台加入jwt令牌功能 1. JWT简述 1.1 什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准&#xff08;(RFC 7…

44A751101-G01 469-P1-HI-A20-E 489-P5-LO-A20

44A751101-G01 469-P1-HI-A20-E 489-P5-LO-A20 在整合IIoT技术的同时&#xff0c;IT/oT融合实施团队将继续就OT网络与公司网络的隔离、OT网络与互联网的隔离、站点和流程级别的最低权限访问控制以及跨站点通信限制做出决策。与此同时&#xff0c;网络安全领域的专业知识正在发…

C++使用serial串口通信 + ROS2程序示例

目录 一、通信协议二、串口调试工具三、serial库的使用3.1 安装serial3.2 serial的使用3.3 绑定端口 四、串口程序示例 串行接口 &#xff08;Serial Interface&#xff09;简称串口&#xff08;通常指COM接口&#xff09;&#xff0c;是采用串行通信方式的扩展接口&#xff0c…

纷享销客获评中小企业数字化转型优质服务商

近日&#xff0c;纷享销客成功入选长沙市工信局评定的【中小企业数字化转型优质服务商】&#xff0c;专业服务实力得到官方认可&#xff01; 今年6月&#xff0c;财政部、工信部联合印发《关于开展中小企业数字化转型城市试点工作的通知》&#xff0c;长沙市成功入选首批中小企…

【2021研电赛】基于ADRC的双轴反作用轮自平衡杆

本作品介绍参与极术社区的有奖征集|分享研电赛作品扩大影响力&#xff0c;更有重磅电子产品免费领取! 论文题目&#xff1a; 基于ADRC的双轴反作用轮自平衡杆 Dual-axis reaction wheel self-balancing rod based on ADRC 参赛单位&#xff1a; 广西科技大学 队伍名称&#x…

使用VMware安装centos虚拟机

下载资源 VMware下载&#xff1a; vmware下载地址 centos镜像下载地址&#xff1a; 下载地址 创建虚拟机 根据流程进行安装&#xff0c; 其中所设定的内存和磁盘大小&#xff0c;可根据需求来进行设置。 需要注意的是&#xff1a; 所定义的磁盘大小&#xff0c; 不会直接…

Java系列之:字符串的截取及分割 split() 和 substring()

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 1、字符串的截取 split() 1.1 使用说明 1.…

群晖7.2版本安装Jellyfin

一、添加三方套件库 打开桌面【套件中心】&#xff0c;点击右上角的【设置】-【套件来源】-【新增】&#xff0c;添加矿神库 名称&#xff1a;我不是矿神 位置&#xff1a;https://spk7.imnks.com/ 二、安装Jellyfin 【套件中心】-搜索【Jellyfin】-【安装套件】 集显版群…

LoRaWAN通信协议物联网应用

LoRaWAN&#xff08;Long Range Wide Area Network&#xff0c;长距离广域网&#xff09;是由LoRa联盟推出的一种低功耗广域网标准&#xff0c;定义了网络的通讯协议和系统架构。该标准提供智能设备间的互联互通服务&#xff0c;无需复杂配置&#xff0c;便于用户、开 发者和企…

[Kettle] Excel输入

Excel文件采用表格的形式&#xff0c;数据显示直观&#xff0c;操作方便 Excel文件采用工作表存储数据&#xff0c;一个文件有多张不同名称的工作表&#xff0c;分别存放相同字段或不同字段的数据 数据源 物理成绩(Kettle数据集2).xls https://download.csdn.net/download/H…

SQL审计是什么意思?目的是什么?有什么好处?

很多刚入行的运维小伙伴对于SQL审计不是很了解&#xff0c;不知道其是什么意思&#xff1f;使用SQL审计的目的是什么&#xff1f;使用SQL审计的好处有哪些&#xff1f;这里我们大家就来一起聊聊&#xff0c;仅供参考哈&#xff01; SQL审计是什么意思&#xff1f; 【回答】&…

研发管理用什么软件?

研发管理用什么软件 研发管理用的软件有&#xff1a;1、JIRA&#xff1b;2、Confluence&#xff1b;3、彩虹PDM软件。彩虹PDM软件 是由南宁市二零二五科技有限公司 自主研发&#xff0c;为用户提供“产品全生命周期管理解决方案”。产品结构管理、BOD管理、零部件管理、工艺管理…

Go 定时任务实现

定时任务简介 定时任务是指按照预定的时间间隔或特定时间点自动执行的计划任务或操作。这些任务通常用于自动化重复性的工作&#xff0c;以减轻人工操作的负担&#xff0c;提高效率。在计算机编程和应用程序开发中&#xff0c;定时任务是一种常见的编程模式&#xff0c;用于周…

【Nginx篇】Nginx轻松上手

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…