【布局 widget】 Flutter GridView

简介: GridView 独有的参数其实只有一个 gridDelegate,gridDelegate 的作用是为 GridView 布局,制定每行几个 child,空白多少等。

GridView 是 ScrollView 的子类,ScrollView 组合了 Scrollable 与 Viewport。 很多参数在 Fluter 滚动的基石 Scrollable 中已经讲过了。并且还有一些与 ListView 重合,可以先看下 Flutter ListView 详解,这里只讲下 GridView 独有的参数。

GridView 独有的参数其实只有一个 gridDelegate,gridDelegate 的作用是为 GridView 布局,制定每行几个 child,空白多少等。

SliverGridDelegate 是一个抽象类,它有两个子类,来完成布局。

SliverGridDelegateWithFixedCrossAxisCount

SliverGridDelegateWithFixedCrossAxisCount 会生成固定的列数。

看下它的参数。按默认 scrollDirection = Axis.vertical 的方式来解释。

  1. childAspectRatio 控制 child 的高宽比。
  2. crossAxisCount

是每行的列数。这个参数是这个子类的核心参数。

  1. crossAxisSpacing 是每列之间的空白
  2. mainAxisExtent 每个 child 的高度。
  3. mainAxisSpacing 每行之间的空白。

SliverGridDelegateWithMaxCrossAxisExtent

SliverGridDelegateWithMaxCrossAxisExtent 每个 child 的有最大宽度的限制。在限制范围内,会尽量宽。

  1. childAspectRatio 控制 child 的高宽比。
  2. maxCrossAxisExtent

每个 child 最大的宽度,只要不超过这个最大宽度,尽量宽。这个参数是这个子类的核心参数。

  1. crossAxisSpacing 是每列之间的空白
  2. mainAxisExtent 每个 child 的高度。
  3. mainAxisSpacing 每行之间的空白。

mainAxisExtent 的优先级高于 childAspectRatio,两个参数同时指定的时候,以 mainAxisExtent 为准。

列表数据很少

如果你的列表数据不是很多,可以一次给 GridView

  GridView(
      gridDelegate:const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 5),
      children: List<Widget>.generate(50, (index) => ListTile(title: Text('$index'),)),
  );

列表数据很多

如果数据很多,不方便一次都给,可以用 itemBuilder,和 ListView 的 itemBuilder 一模一样,不再多说了。

   GridView.builder(
      gridDelegate:const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 5),
      itemBuilder: (context, index) {
         return ListTile(title: Text('$index');
      },
    );

列数固定

数据可以一次性给出,并列表固定,内部用 SliverGridDelegateWithFixedCrossAxisCount 实现

    GridView.count(
        crossAxisCount: 5,
        children: List<Widget>.generate(
            100, (index) => ListTile(title: Text('$index'))));

限定最大宽度

数据可以一次性给出,有宽度最大限制,内部用 ## SliverGridDelegateWithMaxCrossAxisExtent 实现。

 GridView.extent(
        maxCrossAxisExtent: 100,
        children: List<Widget>.generate(
            100, (index) => ListTile(title: Text('$index'))));

自定义

这是灵活度最大的一种。

 GridView.custom(
      gridDelegate:
          const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 5),
      childrenDelegate: SliverChildBuilderDelegate(
          (context, index) => ListTile(title: Text('$index'))),
    );

以上就是所有的 GridView的 构造方式,可以根据情况选用合适的构造函数。

去除空白。

因为 GridView 也是从 BoxScrollView 继承的,所以也会有和 ListView 同样的问题,可能会自动加上空白。去除也很简,指定 padding 为 0 即可。

GridView.count(
      padding: EdgeInsets.zero,
      crossAxisCount: 5,
);
目录
相关文章
|
3月前
|
编解码 前端开发 开发者
【Flutter前端技术开发专栏】Flutter中的响应式设计与自适应布局
【4月更文挑战第30天】Flutter框架助力移动应用实现响应式设计与自适应布局,通过层次化布局系统和`Widget`树管理,结合`BoxConstraints`定义尺寸范围,实现自适应。利用`MediaQuery`获取设备信息,调整布局以适应不同屏幕。`FractionallySizedBox`按比例设定尺寸,`LayoutBuilder`动态计算布局。借助这些工具,开发者能创建跨屏幕尺寸、方向兼容的应用,提升用户体验。
98 0
【Flutter前端技术开发专栏】Flutter中的响应式设计与自适应布局
|
3月前
|
开发框架 前端开发 数据安全/隐私保护
【Flutter 前端技术开发专栏】Flutter 中的布局与样式设计
【4月更文挑战第30天】本文探讨了Flutter的布局和样式设计,关键点包括:1) 布局基础如Column、Row和Stack用于创建复杂结构;2) Container、Center和Expanded等常用组件的作用;3) Theme和Decoration实现全局样式和组件装饰;4) 实战应用如登录界面和列表页面的构建;5) 响应式布局利用MediaQuery和弹性组件适应不同屏幕;6) 性能优化,避免过度复杂设计。了解并掌握这些,有助于开发者创建高效美观的Flutter应用。
86 0
【Flutter 前端技术开发专栏】Flutter 中的布局与样式设计
|
1月前
|
容器
flutter 布局管理【详解】
flutter 布局管理【详解】
21 3
|
1月前
Flutter-自定义折叠流布局实现
Flutter-自定义折叠流布局实现
28 0
|
1月前
Flutter-底部弹出框(Widget层级)
文章描述了如何在Flutter中使用DraggableScrollableSheet创建一个底部弹出框,同时保持其可手势滑动关闭。作者遇到问题并提出对原控件进行扩展,以支持头部和列表布局的滑动关闭功能。
70 0
|
1月前
Flutter 列表学习(listview,gridview,ExpansionTile,ScrollController,RefreshIndicator)
Flutter 列表学习(listview,gridview,ExpansionTile,ScrollController,RefreshIndicator)
|
2月前
Flutter StreamBuilder 实现局部刷新 Widget
Flutter StreamBuilder 实现局部刷新 Widget
22 0
|
3月前
|
Android开发
Flutter完整开发实战详解(六、 深入Widget原理),2024百度Android岗面试真题收录解析
Flutter完整开发实战详解(六、 深入Widget原理),2024百度Android岗面试真题收录解析
|
3月前
|
开发框架 前端开发 搜索推荐
【Flutter前端技术开发专栏】Flutter中的自定义Widget与渲染流程
【4月更文挑战第30天】探索Flutter的自定义Widget与渲染流程。自定义Widget是实现复杂UI设计的关键,优点在于个性化设计、功能扩展和代码复用,但也面临性能优化和复杂性管理的挑战。创建步骤包括设计结构、定义Widget类、实现构建逻辑和处理交互。Flutter渲染流程涉及渲染对象树、布局、绘制和合成阶段。实践案例展示如何创建带渐变背景和阴影的自定义按钮。了解这些知识能提升应用体验并应对开发挑战。查阅官方文档以深入学习。
49 0
【Flutter前端技术开发专栏】Flutter中的自定义Widget与渲染流程
|
3月前
|
JavaScript 前端开发 开发者
【Flutter前端技术开发专栏】Flutter中的Widget与状态管理
【4月更文挑战第30天】本文探讨了Flutter的Widget和状态管理。Widget是Flutter构建UI的基础,分为有状态和无状态两种。状态管理确保UI随应用状态变化更新,影响应用性能和可维护性。文章介绍了`setState`、`Provider`、`Riverpod`、`Bloc`和`Redux`等状态管理方法,并通过计数器应用展示了其实现。选择合适的状态管理策略对高效开发至关重要。
37 0
【Flutter前端技术开发专栏】Flutter中的Widget与状态管理