Flutter分组滚动视图插件grouped_scroll_view的使用

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

Flutter分组滚动视图插件grouped_scroll_view的使用

grouped_scroll_view

Pub support

grouped_scroll_view 是一个用于显示分组列表项的包。提供一个列表、分组器,它将作为一个 ListViewGridView 或其他形式显示。支持在 scrollView 中使用复选框或单选按钮。

预览

分组网格 分组列表 网格切换编辑 列表切换编辑
grouped_grid grouped_list grid_toggle_edit list_toggle_edit
分组网格复选框 分组列表单选 网格复选框 列表单选
grouped_grid_checkbox grouped_list_radio grid_checkbox list_radio

开始使用

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

dependencies:
  grouped_scroll_view: <latest_version>

功能特性

  • 支持粘性头部、自定义分组器、自定义头部、自定义尾部
  • 支持在 scrollView 中使用 复选框单选按钮

使用示例

分组网格视图

GroupedScrollView.grid(
  gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
    mainAxisSpacing: 5, 
    crossAxisSpacing: 5, 
    crossAxisCount: widget.crossAxisCount
  ),
  groupedOptions: GroupedScrollViewOptions(
    itemGrouper: (Person person) {
      return person.birthYear;
    },
    stickyHeaderBuilder: (BuildContext context, int year, int groupedIndex) => Container(
      color: Colors.white,
      padding: const EdgeInsets.all(8),
      constraints: const BoxConstraints.tightFor(height: 30),
      child: Text(
        '$year',
        style: const TextStyle(fontWeight: FontWeight.bold),
      ),
    )
  ),
  itemBuilder: (BuildContext context, Person item) {
    return Container(
      color: Colors.lightGreen,
      padding: const EdgeInsets.all(8),
      constraints: const BoxConstraints.tightFor(width: 100),
      child: Center(
        child: Text(
          item.name,
          style: const TextStyle(fontWeight: FontWeight.bold),
        ),
      ),
    );
  },
  data: DataCache.instance.persons,
  headerBuilder: (BuildContext context) => Column(
    children: const [
      Divider(thickness: 5,),
      Center(
        child: Text(
          'CustomHeader',
          style: TextStyle(fontWeight: FontWeight.bold),
        ),
      ),
      Divider(thickness: 5,),
    ],
  ),
  footerBuilder: (BuildContext context) => Column(
    children: const [
      Divider(thickness: 5,),
      Center(
        child: Text(
          'CustomFooter',
          style: TextStyle(fontWeight: FontWeight.bold),
        ),
      ),
      Divider(thickness: 5,),
    ],
  ),
)

分组列表视图

GroupedScrollView.list(
  groupedOptions: GroupedScrollViewOptions(
    itemGrouper: (Person person) {
      return person.birthYear;
    },
    stickyHeaderBuilder: (BuildContext context, int year, int groupedIndex) => Container(
      color: Colors.white,
      padding: const EdgeInsets.all(8),
      constraints: const BoxConstraints.tightFor(height: 30),
      child: Text(
        '$year',
        style: const TextStyle(fontWeight: FontWeight.bold),
      ),
    ),
  ),
  itemBuilder: (BuildContext context, Person item) {
    return Container(
      constraints: const BoxConstraints.expand(height: 35),
      child: Column(
        children: [
          Container(
            constraints: const BoxConstraints.expand(height: 30),
            color: Colors.lightGreen,
            child: Center(
              child: Text(
                item.name,
                style: const TextStyle(fontWeight: FontWeight.bold),
              ),
            ),
          ),
        ],
      ),
    );
  },
  data: DataCache.instance.persons,
  headerBuilder: (BuildContext context) => Column(
    children: const [
      Divider(thickness: 5,),
      Center(
        child: Text(
          'CustomHeader',
          style: TextStyle(fontWeight: FontWeight.bold),
        ),
      ),
      Divider(thickness: 5,),
    ],
  ),
  footerBuilder: (BuildContext context) => Column(
    children: const [
      Divider(thickness: 5,),
      Center(
        child: Text(
          'CustomFooter',
          style: TextStyle(fontWeight: FontWeight.bold),
        ),
      ),
      Divider(thickness: 5,),
    ],
  ),
)

复选框和单选按钮支持

如果列表需要支持复选框或单选按钮,请设置 toggleEnabledtrue

final controller = GroupedToggleController(
  toggleType: GroupedToggleType.checkbox,
  onToggleChanged: (int idx, bool selected) {
    // ...
  },
  toggleStyle: GroupedToggleStyle(),
);

GroupedScrollViewWithToggle.grid({
  data: List<T>,
  itemBuilder: (BuildContext context, T item) { /*...*/},
  toggleController: controller,
  toggleEnabled: true,
  // ...
});

// dispose
controller.dispose();

完整示例代码

以下是一个完整的示例代码,展示了如何在一个Flutter应用中使用 grouped_scroll_view 插件。

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

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

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

class HomePage extends StatefulWidget {
  final String title;

  HomePage({required this.title});

  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  final List<Person> persons = [
    Person(name: "Alice", birthYear: 1990),
    Person(name: "Bob", birthYear: 1990),
    Person(name: "Charlie", birthYear: 1991),
    Person(name: "David", birthYear: 1992),
    Person(name: "Eve", birthYear: 1992),
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: GroupedScrollView.list(
        groupedOptions: GroupedScrollViewOptions(
          itemGrouper: (Person person) {
            return person.birthYear;
          },
          stickyHeaderBuilder: (BuildContext context, int year, int groupedIndex) => Container(
            color: Colors.white,
            padding: const EdgeInsets.all(8),
            constraints: const BoxConstraints.tightFor(height: 30),
            child: Text(
              '$year',
              style: const TextStyle(fontWeight: FontWeight.bold),
            ),
          ),
        ),
        itemBuilder: (BuildContext context, Person item) {
          return ListTile(
            title: Text(item.name),
          );
        },
        data: persons,
      ),
    );
  }
}

class Person {
  final String name;
  final int birthYear;

  Person({required this.name, required this.birthYear});
}

通过以上内容,您可以轻松地在Flutter项目中使用 grouped_scroll_view 插件来创建分组滚动视图,并根据需要添加复选框或单选按钮功能。


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

1 回复

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


当然,下面是一个关于如何使用Flutter的grouped_scroll_view插件来实现分组滚动视图的示例代码。请注意,grouped_scroll_view并非Flutter官方提供的标准插件,因此假设你提到的grouped_scroll_view是一个第三方库或者一个假设的插件名称。在实际项目中,可能需要找到一个类似的第三方库或自行实现该功能。为了演示目的,这里将展示一个类似分组滚动视图的基本实现。

首先,你需要确保你的Flutter项目中已经添加了必要的依赖(尽管grouped_scroll_view不是官方插件,但这里我们会展示一个类似的实现思路)。然后,你可以创建一个自定义的分组滚动视图。

示例代码

  1. 创建一个Flutter项目(如果还没有的话):
flutter create grouped_scroll_view_example
cd grouped_scroll_view_example
  1. 修改pubspec.yaml文件(如果需要额外的依赖,比如用于数据展示的插件,这里为了简单起见,我们假设不需要额外依赖):
dependencies:
  flutter:
    sdk: flutter
  1. 创建自定义分组滚动视图

lib目录下创建一个新的文件,比如grouped_scroll_view.dart,并在其中实现分组滚动视图。

import 'package:flutter/material.dart';

class GroupedScrollView extends StatelessWidget {
  final List<String> groupTitles;
  final Map<String, List<String>> groupItems;

  GroupedScrollView({required this.groupTitles, required this.groupItems});

  @override
  Widget build(BuildContext context) {
    return CustomScrollView(
      slivers: <Widget>[
        for (var i = 0; i < groupTitles.length; i++)
          SliverStickyHeader(
            header: Container(
              color: Colors.grey[300],
              padding: EdgeInsets.symmetric(horizontal: 16.0),
              alignment: Alignment.centerLeft,
              child: Text(
                groupTitles[i],
                style: TextStyle(fontWeight: FontWeight.bold),
              ),
            ),
            sliver: SliverList(
              delegate: SliverChildBuilderDelegate(
                (BuildContext context, int index) {
                  final group = groupTitles[i];
                  final item = groupItems[group]![index];
                  return ListTile(
                    title: Text(item),
                  );
                },
                childCount: groupItems[groupTitles[i]]!.length,
              ),
            ),
          ),
      ],
    );
  }
}
  1. 使用自定义分组滚动视图

lib/main.dart文件中使用你创建的GroupedScrollView组件。

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

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

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

class MyHomePage extends StatelessWidget {
  final List<String> groupTitles = ['Group 1', 'Group 2', 'Group 3'];
  final Map<String, List<String>> groupItems = {
    'Group 1': ['Item 1.1', 'Item 1.2', 'Item 1.3'],
    'Group 2': ['Item 2.1', 'Item 2.2', 'Item 2.3', 'Item 2.4'],
    'Group 3': ['Item 3.1', 'Item 3.2'],
  };

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Grouped Scroll View Example'),
      ),
      body: GroupedScrollView(
        groupTitles: groupTitles,
        groupItems: groupItems,
      ),
    );
  }
}

解释

  • GroupedScrollView:这是一个自定义的StatelessWidget,它接受两个参数:groupTitles(分组标题列表)和groupItems(一个映射,将每个分组标题映射到其项列表)。
  • SliverStickyHeader:用于创建粘性头部效果。在这个例子中,每个分组的标题都会作为粘性头部。
  • SliverList:用于展示每个分组中的项。

这个示例展示了如何使用Flutter的基本组件来创建一个类似分组滚动视图的效果。如果你确实在寻找一个名为grouped_scroll_view的第三方插件,请查阅其官方文档以获取更具体的用法。

回到顶部