Flutter分组网格布局插件grouped_grid的使用

Flutter分组网格布局插件grouped_grid的使用

Pub 支持平台

一个用于显示分组网格项目的包。

预览

应用程序在示例文件夹中的应用截图:

特性

提供带有以下特性的分组GridView变体:

  • 支持主标题和尾部。
  • 支持组标题和尾部(两者都是可选的)。
  • 可以选择是否使用粘性组标题(默认为粘性组标题)。

SDK要求

此包需要 Dart 3,因为它在 itemBuilder 签名中使用了 <strong>Records语法</strong>

environment:
  sdk: '>=3.0.0 <4.0.0'
  flutter: ">=3.10.0"

使用

示例使用以下代码创建按 TimeControlType 分组的时间控制项网格,并带有粘性组标题。

检查示例文件夹以获取完整实现。

import 'package:flutter/material.dart';
import 'package:grouped_grid/grouped_grid.dart';

import '../../../domain/entity/time_control.dart';

class TimeControlGroupedGridView extends StatelessWidget {

  const TimeControlGroupedGridView({super.key, required this.data, required this.columnCount});

  final int columnCount;
  final Map<TimeControlType, List<TimeControl>> data;

  @override
  Widget build(BuildContext context) {
    return GroupedGridView(
      gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
        crossAxisCount: columnCount,
        crossAxisSpacing: 2,
        mainAxisSpacing: 2,
      ),
      groupKeys: data.keys,
      groupHeaderBuilder: _groupHeaderBuilder,
      itemCountForGroup: _itemCountForGroup,
      itemBuilder: _itemBuilder,
    );
  }

  Widget _groupHeaderBuilder(BuildContext context, TimeControlType group) {
    // 实现组头构建器
  }

  int _itemCountForGroup(TimeControlType key) {
    // 返回给定组中的项目数量
  }

  Widget _itemBuilder(BuildContext context, ({TimeControlType key, int itemIndex}) group) {
    // 返回给定组和索引的项目
  }
}

感谢

该项目合并了两个dart包的想法,我想感谢两位作者:


更多关于Flutter分组网格布局插件grouped_grid的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter分组网格布局插件grouped_grid的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter中使用grouped_grid插件来实现分组网格布局的示例代码。grouped_grid插件允许你以分组的方式展示网格项,非常适合用于展示具有分类标签的数据集合。

首先,确保你已经在pubspec.yaml文件中添加了grouped_grid依赖:

dependencies:
  flutter:
    sdk: flutter
  grouped_grid: ^最新版本号  # 替换为最新的版本号

然后运行flutter pub get来安装依赖。

接下来是一个完整的示例代码,展示了如何使用grouped_grid插件:

import 'package:flutter/material.dart';
import 'package:grouped_grid/grouped_grid.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Grouped Grid Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  final List<GroupedItem> items = [
    GroupedItem(
      group: 'Group 1',
      title: 'Item 1.1',
      child: Container(
        color: Colors.red,
        child: Center(child: Text('Item 1.1')),
      ),
    ),
    GroupedItem(
      group: 'Group 1',
      title: 'Item 1.2',
      child: Container(
        color: Colors.green,
        child: Center(child: Text('Item 1.2')),
      ),
    ),
    GroupedItem(
      group: 'Group 2',
      title: 'Item 2.1',
      child: Container(
        color: Colors.blue,
        child: Center(child: Text('Item 2.1')),
      ),
    ),
    GroupedItem(
      group: 'Group 2',
      title: 'Item 2.2',
      child: Container(
        color: Colors.yellow,
        child: Center(child: Text('Item 2.2')),
      ),
    ),
    GroupedItem(
      group: 'Group 3',
      title: 'Item 3.1',
      child: Container(
        color: Colors.purple,
        child: Center(child: Text('Item 3.1')),
      ),
    ),
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Grouped Grid Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: GroupedGridView<GroupedItem>(
          items: items,
          groupHeaderBuilder: (context, group) {
            return Padding(
              padding: const EdgeInsets.symmetric(vertical: 8.0),
              child: Text(
                group,
                style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
              ),
            );
          },
          itemBuilder: (context, item) {
            return item.child;
          },
          gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
            crossAxisCount: 2,
            crossAxisSpacing: 8.0,
            mainAxisSpacing: 8.0,
          ),
        ),
      ),
    );
  }
}

class GroupedItem {
  final String group;
  final String title;
  final Widget child;

  GroupedItem({required this.group, required this.title, required this.child});
}

代码解释

  1. 依赖添加:在pubspec.yaml中添加grouped_grid依赖。

  2. 数据模型:创建了一个GroupedItem类来存储每个网格项的信息,包括所属的组、标题和子组件。

  3. 主应用MyApp类作为应用的主入口,定义了应用的主题和首页。

  4. 首页MyHomePage类负责构建分组网格布局。

    • 使用GroupedGridView来展示分组网格项。
    • groupHeaderBuilder用于构建每个组的头部,这里简单地显示组的名称。
    • itemBuilder用于构建每个网格项的内容。
    • gridDelegate定义了网格的布局,这里使用了SliverGridDelegateWithFixedCrossAxisCount,指定了每行2个网格项,以及网格项之间的间距。

通过这种方式,你可以很方便地在Flutter应用中实现分组网格布局。如果有更多自定义需求,你可以进一步调整GroupedGridView的参数和方法。

回到顶部