【Flutter】GridView的使用之GridView.extent

本文深入探讨了Flutter框架中GridView.extent的使用方法,解释了如何通过设置maxCrossAxisExtent来动态调整Item的数量和宽度,以适应不同的屏幕尺寸。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

想了解更多关于Flutter的知识,可以关注:
https://github.com/jiangkang/flutter-system
https://jiangkang.tech

在上一篇文章 GridView.count 中讲过 GridView.count的用法,这里讲一下GridView.extent的用法。

GridView.count 是在交叉轴上创建固定个数的Item,crossAxisCount为必须的属性,表示交叉轴Item的个数;
GridView.extent是在交叉轴上创建最大可容纳的Item,maxCrossAxisExtent是必须的属性,表示交叉轴上Item最大的宽度;

如果GridView的主轴是纵轴,横轴是交叉轴(默认情况),设定交叉轴的宽度为500px,maxCrossAxisExtent 为 150,由于4x150 < 500 < 5 x150,因此Item有4个,500px/ 4 = 125px,因此Item的宽度为125px(不考虑Item之间的间距)。

下面看一下具体的例子:

  • maxCrossAxisExtent = 1000:
    在这里插入图片描述
  • maxCrossAxisExtent = 100:
    在这里插入图片描述
  • maxCrossAxisExtent = 10:
    在这里插入图片描述
### Flutter 中 ListView 和 GridView使用教程及区别 #### ListView 组件概述 `ListView` 是一种用于展示一维线性列表的组件,在 Flutter 应用开发中非常常见。此组件支持垂直和水平方向上的项目排列,并能够处理静态或动态的数据源[^1]。 ```dart import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(title: Text('ListView Example')), body: ListView(children: [ ListTile(title: Text('Item 1')), Divider(), ListTile(title: Text('Item 2')), Divider(), // 更多子项... ]), ), ); } } ``` #### GridView 组件概述 `GridView` 提供了一种更加灵活的方式来创建二维网格布局,适用于需要以行列形式展示多个项目的场景。它同样可以适应固定数量或是通过构建器按需加载更多条目的情况[^2]。 ```dart import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @Override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData(primarySwatch: Colors.blue), home: Scaffold( appBar: AppBar(title: const Text('Grid View Example')), body: GridView.count( crossAxisCount: 2, children: List.generate(10, (index) { return Center(child: Text('Item $index')); }), ), ), ); } } ``` #### 主要差异点分析 - **滚动维度**:`ListView` 默认情况下仅允许在一轴上滚动(通常是纵向),而 `GridView` 支持两轴间的交互操作,即可以在横向纵向上同时进行滚动。 - **布局模式**:前者采用的是简单的线性布局方式;后者则提供了更为复杂的网格状布局选项,如 `count` 或者 `extent` 来定义每行/列中的单元格数目及其大小限制[^3]。 - **性能考量**:当涉及到大量数据渲染时,两者都可通过设置特定参数优化性能表现。对于 `ListView` 而言,可以通过配置 `shrinkWrap` 属性减少不必要的重绘开销;而对于 `GridView` ,利用 `builder` 构造函数能有效提升效率并降低内存占用。 #### 解决嵌套冲突的方法 如果在一个 `ListView` 内部想要放置另一个可滚动的小部件比如 `GridView` , 需要注意防止二者之间的滚动事件相互干扰。解决方案之一是在外部容器处指定 `NeverScrollableScrollPhysics()` 物理特性以及开启 `shrinkWrap` 参数来调整内部尺寸计算逻辑。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值