Flutter分组网格视图插件group_grid_view的使用

发布于 1周前 作者 ionicwang 来自 Flutter

Flutter分组网格视图插件group_grid_view的使用

Group Grid View

GroupGridView 是一个允许你将列表项分组并支持类似 iOS UICollectionView 分区头部和尾部的 GridView

Features

  • 网格项可以被分组。
  • 支持每个组的头部和尾部。
  • 提供了 GridView.builder 构造函数中的所有字段。

Alt Text

Installing

在你的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  group_grid_view: ^latest

Import

导入包:

import 'package:group_grid_view/group_grid_view.dart';

Usage

你可以像使用其他小部件一样使用它,完整的示例可以在 /example 文件夹中找到。

以下是完整的示例代码,展示了如何创建一个带有分组的网格视图:

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

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Group Grid View'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final List<TestModel> dataSource = [
    TestModel(
        sectionName: "Animals",
        listItems: ["Dog", "Cat", "Bear", "Tiger", "Lion"]),
    TestModel(
        sectionName: "Vehicle",
        footerName: "End of vehicle section",
        listItems: ["Car", "Motor", "Air plane", "Boat"]),
    TestModel(sectionName: "Countries", listItems: [
      "Vietnam",
      "China",
      "Laos",
      "Thai",
      "Japan",
      "Singapore",
      "England",
      "USA",
      "Russian"
    ]),
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: GroupGridView(
          padding: const EdgeInsets.symmetric(horizontal: 16),
          gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
              crossAxisCount: 3, mainAxisSpacing: 16, crossAxisSpacing: 16),
          sectionCount: dataSource.length,
          headerForSection: (section) => Container(
              padding: const EdgeInsets.symmetric(vertical: 12),
              child: Text(dataSource[section].sectionName,
                  style: const TextStyle(fontSize: 22, fontWeight: FontWeight.bold))),
          footerForSection: (section) {
            final footer = dataSource[section].footerName;
            return footer != null
                ? Container(
                    padding: const EdgeInsets.only(top: 12, bottom: 32),
                    child: Text(footer, style: const TextStyle(fontSize: 16)))
                : const SizedBox(height: 32);
          },
          itemInSectionBuilder: (_, indexPath) {
            final data =
                dataSource[indexPath.section].listItems[indexPath.index];
            return Container(
                decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(8),
                    border: Border.all(color: Colors.blue)),
                alignment: Alignment.center,
                padding: const EdgeInsets.all(8),
                child: Text(data, style: const TextStyle(fontWeight: FontWeight.w500)));
          },
          itemInSectionCount: (section) =>
              dataSource[section].listItems.length),
    );
  }
}

class TestModel {
  TestModel({
    required this.sectionName,
    required this.listItems,
    this.footerName,
  });

  final String sectionName;
  final String? footerName;
  final List<String> listItems;
}

这个例子展示了如何创建一个分组网格视图,并为每个分组添加头部和尾部。你可以根据自己的需求调整数据源和样式。希望这对你有所帮助!如果有任何问题或需要进一步的帮助,请随时告诉我。

Trần Đạt, Thank you!


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

1 回复

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


当然,下面是一个关于如何使用 group_grid_view 插件在 Flutter 中实现分组网格视图的示例代码。group_grid_view 插件允许你创建带有分组标题的网格视图。

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

dependencies:
  flutter:
    sdk: flutter
  group_grid_view: ^x.y.z  # 请替换为最新版本号

然后运行 flutter pub get 来获取依赖。

接下来,在你的 Dart 文件中,你可以使用 GroupGridView 来创建一个分组网格视图。以下是一个完整的示例代码:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Group GridView Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: GroupGridViewScreen(),
    );
  }
}

class GroupGridViewScreen extends StatelessWidget {
  final List<GroupItem> groups = [
    GroupItem(
      header: 'Group 1',
      items: [
        'Item 1-1',
        'Item 1-2',
        'Item 1-3',
      ],
    ),
    GroupItem(
      header: 'Group 2',
      items: [
        'Item 2-1',
        'Item 2-2',
      ],
    ),
    GroupItem(
      header: 'Group 3',
      items: [
        'Item 3-1',
        'Item 3-2',
        'Item 3-3',
        'Item 3-4',
      ],
    ),
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Group GridView Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: GroupGridView<String>(
          groups: groups,
          crossAxisCount: 2, // 每行显示的项数
          mainAxisSpacing: 16.0, // 主轴间距
          crossAxisSpacing: 16.0, // 交叉轴间距
          padding: EdgeInsets.all(8.0),
          groupHeaderBuilder: (BuildContext context, String header) {
            return Padding(
              padding: const EdgeInsets.only(bottom: 8.0),
              child: Text(
                header,
                style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
              ),
            );
          },
          itemBuilder: (BuildContext context, String item) {
            return Card(
              child: Center(
                child: Text(item),
              ),
            );
          },
        ),
      ),
    );
  }
}

class GroupItem {
  final String header;
  final List<String> items;

  GroupItem({required this.header, required this.items});
}

在这个示例中:

  1. 我们定义了一个 GroupItem 类来存储每个组的标题和项目列表。
  2. GroupGridViewScreen 中,我们创建了一个包含多个 GroupItem 的列表。
  3. 使用 GroupGridView 小部件来显示这些组。我们设置了 crossAxisCount 来定义每行显示的项数,并定义了主轴和交叉轴的间距。
  4. groupHeaderBuilder 用于构建每个组的标题。
  5. itemBuilder 用于构建每个项目。

运行这个代码,你将看到一个带有分组标题的网格视图,每个组中的项目以网格形式显示。

回到顶部