Flutter分组列表插件grouped_list的使用

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

Flutter分组列表插件grouped_list的使用

Grouped list package for Flutter

pub package package publisher build

Flutter中的ListView,其中列表项可以被分组成部分。

Chat Example Example

Features

  • 支持空安全!
  • 易于创建聊天对话框。
  • 列表项可以在组中分离。
  • 可以为组设置单独的标题。
  • 几乎所有来自ListView.builder的字段都可用。

Getting Started

添加依赖

在您的pubspec.yaml文件中添加此包:

dependencies:
  grouped_list: ^6.0.0

在您的Dart文件中导入库:

import 'package:grouped_list/grouped_list.dart';

GroupedListView Widget 替代 ListView 创建:

GroupedListView<dynamic, String>(
  elements: _elements,
  groupBy: (element) => element['group'],
  groupSeparatorBuilder: (String groupByValue) => Text(groupByValue),
  itemBuilder: (context, dynamic element) => Text(element['name']),
  itemComparator: (item1, item2) => item1['name'].compareTo(item2['name']), // optional
  useStickyGroupSeparators: true, // optional
  floatingHeader: true, // optional
  order: GroupedListOrder.ASC, // optional
  footer: Text("Widget at the bottom of list"), // optional
),

参数

名称 描述 是否必填 默认值
elements 您想要在列表中显示的数据列表 -
groupBy 将元素映射到其分组值的函数 -
itemBuilder / indexedItemBuilder / interdependentItemBuilder / grouItemBuilder 返回定义项目的Widget的函数。
* indexedItemBuilder还提供当前索引。
* interdependentItemBuilder还提供前一个和下一个项目。
* groupItemBuilder提供该物品是否是组内的第一个或最后一个元素的信息。
indexedItemBuilder优于interdependentItemBuilderinterdependentItemBuilder优于itemBuilder
是,四个选一个 -
groupSeparatorBuilder / groupHeaderBuilder 返回定义组标题的Widget的函数。虽然groupSeparatorBuildergroupBy值作为参数,但groupHeaderBuilder以整个元素作为参数。如果两者都已定义,则优先使用groupHeaderBuilder 是,两个选一个 -
groupStickyHeaderBuilder useStickyGroupSeparators为true时,返回定义粘性组头的Widget的函数。如果没有定义,则根据上述描述使用groupSeparatorBuildergroupHeaderBuilder -
useStickyGroupSeparators 当设置为true时,当前可见组的组头将固定在顶部 false
floatingHeader 粘性组头是否浮动在列表上还是占用自己的空间 false
stickyHeaderBackgroundColor 定义粘性头的背景颜色。仅当使用useStickyGroupSeparators时使用 Color(0xffF7F7F7)
separator 定义组内项目之间分隔符的Widget 无分隔符
groupComparator 用于定义组自定义排序。否则使用自然排序顺序 -
itemComparator 用于定义每个组内元素的自定义排序。否则使用自然排序顺序 -
order 更改为GroupedListOrder.DESC以反转组排序 GroupedListOrder.ASC
footer 列表底部的Widget -

ListView.builder的所有字段也可以使用。

Highlight - SilverGroupedList

现在支持基于银色列表的分组列表。只需使用SilverGroupedListView代替GroupedListView。示例可以在example/lib/example_silver下找到。 注意,GroupedListView的一些选项目前在SilverGroupedListView中不可用。

Highlight - Chat Dialog

轻松创建聊天对话框。 只需将选项reverse设置为true并将order设置为GroupedListOrder.DESC。完整示例可以在示例中找到。 列表将在初始状态下滚动到底部,因此滚动将与阅读方向相反。

示例代码

以下是完整的示例代码:

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

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

List _elements = [
  {'name': 'John', 'group': 'Team A'},
  {'name': 'Will', 'group': 'Team B'},
  {'name': 'Beth', 'group': 'Team A'},
  {'name': 'Miranda', 'group': 'Team B'},
  {'name': 'Mike', 'group': 'Team C'},
  {'name': 'Danny', 'group': 'Team C'},
];

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Grouped List View Example'),
        ),
        body: _createGroupedListView(),
      ),
    );
  }

  _createGroupedListView() {
    return GroupedListView<dynamic, String>(
      elements: _elements,
      groupBy: (element) => element['group'],
      groupComparator: (value1, value2) => value2.compareTo(value1),
      itemComparator: (item1, item2) => item1['name'].compareTo(item2['name']),
      order: GroupedListOrder.DESC,
      useStickyGroupSeparators: true,
      groupSeparatorBuilder: (String value) => Padding(
        padding: const EdgeInsets.all(8.0),
        child: Text(
          value,
          textAlign: TextAlign.center,
          style: const TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
        ),
      ),
      itemBuilder: (c, element) {
        return Card(
          elevation: 8.0,
          margin: const EdgeInsets.symmetric(horizontal: 10.0, vertical: 6.0),
          child: SizedBox(
            child: ListTile(
              contentPadding: const EdgeInsets.symmetric(horizontal: 20.0, vertical: 10.0),
              leading: const Icon(Icons.account_circle),
              title: Text(element['name']),
              trailing: const Icon(Icons.arrow_forward),
            ),
          ),
        );
      },
    );
  }
}

通过以上内容,您可以了解如何使用grouped_list插件来创建分组列表,并根据需要进行自定义。希望这对您有所帮助!


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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用grouped_list插件来实现分组列表的示例代码。

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

dependencies:
  flutter:
    sdk: flutter
  grouped_list: ^4.0.0  # 请检查最新版本号

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

接下来,下面是一个完整的示例代码,展示了如何使用grouped_list来创建一个分组列表:

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

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

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

class GroupedListDemo extends StatefulWidget {
  @override
  _GroupedListDemoState createState() => _GroupedListDemoState();
}

class _GroupedListDemoState extends State<GroupedListDemo> {
  final List<Map<String, dynamic>> _groupedItems = List.generate(20, (index) {
    return {
      'letter': index % 2 == 0 ? 'A' : 'B',
      'name': 'Item ${index + 1}',
    };
  }).toList();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Grouped List Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: GroupedListView<Map<String, dynamic>, String>(
          elements: _groupedItems,
          groupBy: (element) => element['letter'] as String,
          groupSeparatorBuilder: (String groupByValue) {
            return Padding(
              padding: const EdgeInsets.symmetric(vertical: 8.0),
              child: Text(
                groupByValue,
                style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
              ),
            );
          },
          itemBuilder: (context, element) {
            return ListTile(
              title: Text(element['name'] as String),
            );
          },
          itemCount: _groupedItems.length,
          order: GroupedListOrder.ASC, // or GroupedListOrder.DESC
        ),
      ),
    );
  }
}

代码解释:

  1. 依赖导入

    import 'package:grouped_list/grouped_list.dart';
    
  2. 数据源

    final List<Map<String, dynamic>> _groupedItems = List.generate(20, (index) {
      return {
        'letter': index % 2 == 0 ? 'A' : 'B',
        'name': 'Item ${index + 1}',
      };
    }).toList();
    

    这里我们创建了一个包含20个项目的列表,每个项目都有一个letter属性用于分组,以及一个name属性作为显示内容。

  3. GroupedListView

    GroupedListView<Map<String, dynamic>, String>(
      elements: _groupedItems,
      groupBy: (element) => element['letter'] as String,
      groupSeparatorBuilder: (String groupByValue) {
        return Padding(
          padding: const EdgeInsets.symmetric(vertical: 8.0),
          child: Text(
            groupByValue,
            style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
          ),
        );
      },
      itemBuilder: (context, element) {
        return ListTile(
          title: Text(element['name'] as String),
        );
      },
      itemCount: _groupedItems.length,
      order: GroupedListOrder.ASC, // or GroupedListOrder.DESC
    )
    
    • elements:传入数据源。
    • groupBy:指定如何分组,这里按letter属性分组。
    • groupSeparatorBuilder:用于构建每个分组的头部。
    • itemBuilder:用于构建每个列表项。
    • itemCount:数据源的总长度。
    • order:指定分组排序顺序,可以是升序(GroupedListOrder.ASC)或降序(GroupedListOrder.DESC)。

这个示例展示了如何使用grouped_list插件在Flutter中创建一个简单的分组列表。你可以根据需要调整数据源和UI样式。

回到顶部