【布局 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,
);
目录
相关文章
|
20天前
深入理解Flutter鸿蒙next版本 中的Widget继承:使用extends获取数据与父类约束
本文详细介绍了Flutter中如何通过继承其他Widget来创建自定义组件。首先解释了Widget继承的基本概念,包括StatelessWidget和StatefulWidget的区别。接着通过具体示例展示了如何继承StatelessWidget和StatefulWidget,并在子类中访问父类的build方法和状态。最后,结合多个自定义Widget展示了如何在实际应用中灵活使用继承和组合来构建复杂的UI。
70 8
|
20天前
|
开发者 容器
Flutter&鸿蒙next 布局架构原理详解
本文详细介绍了 Flutter 中的主要布局方式,包括 Row、Column、Stack、Container、ListView 和 GridView 等布局组件的架构原理及使用场景。通过了解这些布局 Widget 的基本概念、关键属性和布局原理,开发者可以更高效地构建复杂的用户界面。此外,文章还提供了布局优化技巧,帮助提升应用性能。
79 4
|
18天前
|
容器
flutter&鸿蒙next 使用 InheritedWidget 实现跨 Widget 传递状态
在 Flutter 中,状态管理至关重要。本文详细介绍了如何使用 InheritedWidget 实现跨 Widget 的状态传递。InheritedWidget 允许数据在 Widget 树中向下传递,适用于多层嵌套的场景。通过一个简单的计数器示例,展示了如何创建和使用 InheritedWidget,包括其基础概念、工作原理及代码实现。虽然 InheritedWidget 较底层,但它是许多高级状态管理解决方案的基础。
91 2
|
20天前
|
容器
深入理解 Flutter 鸿蒙版的 Stack 布局:适配屏幕与层叠样式布局
Flutter 的 Stack 布局组件允许你将多个子组件层叠在一起,实现复杂的界面效果。本文介绍了 Stack 的基本用法、核心概念(如子组件层叠、Positioned 组件和对齐属性),以及如何使用 MediaQuery 和 LayoutBuilder 实现响应式设计。通过示例展示了照片展示与文字描述、动态调整层叠布局等高级用法,帮助你构建更加精美和实用的 Flutter 应用。
107 2
|
1月前
|
容器
Flutter&鸿蒙next 布局架构原理详解
Flutter&鸿蒙next 布局架构原理详解
|
1月前
|
Android开发 开发者 容器
flutter:&UI布局 (六)
本文档介绍了Flutter中的UI布局方式,包括线性布局(如Column和Row)、非线性布局(如Stack、Flex、Positioned)以及Wrap布局等。通过具体示例代码展示了如何使用这些布局组件来构建灵活多变的用户界面,例如使用Column垂直排列文本、使用Stack叠加组件、以及利用Wrap实现自动换行的按钮布局等。
|
1月前
|
容器
flutter:第一个flutter&Widget的使用 (二)
本文介绍了Flutter框架下的基本组件及其用法,包括简单的 Stateless Widget 如文本和按钮,以及更复杂的 StatefulWidget 示例。详细解释了如何使用 `context` 获取祖先小部件的信息,并展示了 `MaterialApp` 的属性及用途。此外,还探讨了 `StatefulWidget` 与 `StatelessWidget` 的区别,以及 `AppBar` 的常见属性配置方法。适合Flutter初学者参考学习。
|
18天前
|
Dart JavaScript 前端开发
Flutter 的 Widget 概述与常用 Widgets 与鸿蒙 Next 的对比
Flutter 是 Google 开发的开源 UI 框架,用于快速构建高性能的移动、Web 和桌面应用。Flutter 通过 Widget 构建 UI,每个 UI 元素都是 Widget,包括文本、按钮、图片等。Widget 不仅描述外观,还描述行为,是不可变的。常见的 Widget 包括结构型(Container、Column、Row)、呈现型(Text、Image)、交互型(ElevatedButton)和状态管理型(StatefulWidget)。Flutter 与鸿蒙 Next 在组件化架构、开发语言、布局系统、性能和跨平台支持方面各有优势
68 0
|
4月前
|
容器
flutter 布局管理【详解】
flutter 布局管理【详解】
40 3
|
4月前
Flutter-自定义折叠流布局实现
Flutter-自定义折叠流布局实现
83 0