Flutter分组列表插件z_grouped_list的使用

Flutter分组列表插件z_grouped_list的使用

特性

  • 支持列表视图和网格视图。
  • 可以将数据分成不同的组。
  • 可以按升序或降序排列数据。
  • 每个组可以有唯一的头部。

安装

在你的 pubspec.yaml 文件的 dependencies: 部分添加以下行:

dependencies:
  z_grouped_list: <最新版本>

然后在 Dart 代码中导入它:

import 'package:z_grouped_list/z_grouped_list.dart';

使用方法

重要提示!请确保你的代码被 ExpandedSizedBox 包裹。

简单列表实现:

ZGroupedList(
  // 你的项目列表
  items: books,
  // 你要根据什么元素进行排序?
  sortBy: (item) {
    int year = item['year'];
    return year;
  },
  // 项目小部件
  itemBuilder: (context, item) {
    String? name = item['name'];
    return Text(name ?? "empty"); // 如果 name 为空则显示 "empty"
  },
  // 组分隔符小部件
  groupSeparatorBuilder: (year) {
    return Text(year.toString());
  },
),

网格列表实现:

ZGroupedList.grid(
  // 每行显示3个项目
  crossAxisCount: 3,

  // 所有的项目列表
  items: books,
  // 你要根据什么元素进行排序?
  sortBy: (item) {
    int year = item['year'];
    return year;
  },
  // 项目小部件
  itemBuilder: (context, item) {
    String? name = item['name'];
    return Text(name ?? "empty"); // 如果 name 为空则显示 "empty"
  },
  // 组分隔符小部件
  groupSeparatorBuilder: (year) {
    return Text(year.toString());
  },

  // 自定义网格委托(可选)
  gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent(
    maxCrossAxisExtent: 80,
    childAspectRatio: 5 / 9,
    crossAxisSpacing: 25,
    mainAxisSpacing: 15,
  ),
),

参数说明

对于普通列表:

名称 描述 是否必须 默认值
items 显示在列表中的数据列表 -
sortBy 将元素映射到其分组值的函数 -
itemBuilder 构建项目小部件的函数 -
groupSeparatorBuilder 构建分组分隔符小部件的函数 -
descendingOrder 数据是否按降序组织 true

对于网格列表:

名称 描述 是否必须 默认值
crossAxisCount 每行有多少个项目 1
gridDelegate 传递自定义网格委托 -

示例代码

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

void main() => runApp(const MyApp());

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

  // 示例书籍列表
  static const List<Map<String, dynamic>> _books = [
    {"name": "Atomic Habits", "year": 2018},
    {"name": "The Miracle Morning", "year": 2018},
    {"name": "Jurassic Park", "year": 2019},
  ];

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: Scaffold(
        appBar: AppBar(
          backgroundColor: Theme.of(context).colorScheme.inversePrimary,
          title: const Text("Grouped List"),
        ),
        body: Column(
          children: [
            Expanded(
              child: ZGroupedList(
                // 所有的项目列表
                items: _books,
                // 你要根据什么元素进行排序?
                sortBy: (item) {
                  int year = item['year'];
                  return year;
                },
                // 项目小部件
                itemBuilder: (context, item) {
                  String? name = item['name'];
                  return Text(name ?? "empty"); // 如果 name 为空则显示 "empty"
                },
                // 组分隔符小部件
                groupSeparatorBuilder: (year) {
                  return Text(year.toString());
                },
              ),
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


z_grouped_list 是一个用于 Flutter 的分组列表插件,它可以帮助你轻松地创建带有分组标题的列表。这个插件非常适合展示需要按类别分组的数据,例如联系人列表、商品分类等。

安装

首先,你需要在 pubspec.yaml 文件中添加 z_grouped_list 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  z_grouped_list: ^1.0.0  # 请使用最新版本

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

基本用法

z_grouped_list 的核心是 GroupedListView 组件,它允许你将数据分组并在列表中显示。以下是一个简单的示例,展示了如何使用 GroupedListView 来显示一个分组列表。

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Grouped List Example'),
        ),
        body: GroupedListViewExample(),
      ),
    );
  }
}

class GroupedListViewExample extends StatelessWidget {
  // 示例数据
  final List<Map<String, String>> _elements = [
    {"name": "Apple", "group": "Fruits"},
    {"name": "Banana", "group": "Fruits"},
    {"name": "Orange", "group": "Fruits"},
    {"name": "Carrot", "group": "Vegetables"},
    {"name": "Broccoli", "group": "Vegetables"},
    {"name": "Tomato", "group": "Vegetables"},
    {"name": "Beef", "group": "Meat"},
    {"name": "Chicken", "group": "Meat"},
    {"name": "Pork", "group": "Meat"},
  ];

  [@override](/user/override)
  Widget build(BuildContext context) {
    return GroupedListView<dynamic, String>(
      elements: _elements,
      groupBy: (element) => element['group']!,
      groupSeparatorBuilder: (String groupByValue) => Padding(
        padding: const EdgeInsets.all(8.0),
        child: Text(
          groupByValue,
          style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
        ),
      ),
      itemBuilder: (context, element) {
        return Card(
          elevation: 8.0,
          margin: EdgeInsets.symmetric(horizontal: 10.0, vertical: 6.0),
          child: ListTile(
            contentPadding: EdgeInsets.symmetric(horizontal: 20.0, vertical: 10.0),
            title: Text(element['name']!),
            leading: Icon(Icons.food_bank),
          ),
        );
      },
      itemComparator: (item1, item2) => item1['name']!.compareTo(item2['name']!), // optional
      useStickyGroupSeparators: true, // optional
      floatingHeader: true, // optional
      order: GroupedListOrder.ASC, // optional
    );
  }
}
回到顶部