Flutter分组选择插件group_select的使用

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

Flutter分组选择插件group_select的使用

简介

group_select 是一个用于Flutter的多选组件,支持分组选择。你可以通过创建控制器来控制组件的行为,并且可以指定自定义类型。

DEMO

查看在线演示:http://group-select.esquilodigital.com.br/#/

开始使用

首先,导入包:

import 'package:group_select/group_select.dart';

使用方法

要使用该组件,需要创建一个控制器,并可以为控制器和组件指定自定义类型。

创建控制器

final controller = SelectGroupController<int>(
    lang: LangBadge.enUS,
    multiple: false,
    dark: false,
);

final groupController = SelectGroupController<String>();

初始化组件

初始化组件时需要传递一个控制器:

带有项目的组件

GroupSelect<int>(
    activeColor: Colors.red,
    title: 'With items',
    controller: controller,
    items: [
        Item(title: 'Item 1', value: 1),
        Item(title: 'Item 2', value: 2),
        Item(title: 'Item 3', value: 3),
        Item(title: 'Item 4', value: 4),
        Item(title: 'Item 5', value: 5),
    ],
)

带有分组项目的组件

GroupSelect<String>(
    title: 'With groups items',
    activeColor: Colors.green,
    controller: groupController,
    onChange: (values) {
        print(values);
    },
    groups: [
        Group(
            title: 'Grupo 1',
            id: '1',
            items: [
                Item(title: 'Item 1', value: '1'),
                Item(title: 'Item 2', value: '2'),
                Item(title: 'Item 3', value: '3'),
                Item(title: 'Item 4', value: '4'),
                Item(title: 'Item 5', value: '5'),
            ],
        ),
        Group(
            title: 'Grupo 2',
            id: '2',
            items: [
                Item(title: 'Item 1', value: '6'),
                Item(title: 'Item 2', value: '7'),
                Item(title: 'Item 3', value: '8'),
                Item(title: 'Item 4', value: '9'),
                Item(title: 'Item 5', value: '10'),
            ],
        ),
    ],
)

注意:每个分组需要有一个唯一的ID。

属性说明

分组

分组接收项目,并且必须具有唯一ID:

Group(
    title: 'Grupo 2',
    id: '2',
    items: [
        Item(title: 'Item 1', value: '6'),
        Item(title: 'Item 2', value: '7'),
        Item(title: 'Item 3', value: '8'),
        Item(title: 'Item 4', value: '9'),
        Item(title: 'Item 5', value: '10'),
    ],
)

项目

项目可以包含一个 leading,它可以是任何Widget:

Item(
    title: 'Item 4',
    value: '4',
    leading: const Icon(Icons.circle),
);

Item(
    title: 'Item 4',
    value: '4',
    leading: Image.asset('path/to/image'),
);

onChange 回调

当选择项发生变化时始终会被调用:

GroupSelect<T>(
    title: 'With groups items',
    activeColor: Colors.green,
    controller: groupController,
    onChange: (dynamic values) {
        print(values);
    }
    // ... 其他代码省略
)

activeColor 属性

可以更改活动状态下的徽章和复选框的颜色:

GroupSelect<String>(
    title: 'With groups items',
    activeColor: Colors.green,
);

dark 模式

启用组件的暗模式。请参阅在线演示中的示例。

控制器

获取选中值

如果启用了多项选择,则返回值是一个列表:

dynamic get value;

重置值

使用以下方法清除值:

void resetValues();

示例Demo

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

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

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

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

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

class HomePage extends StatefulWidget {
  const HomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  final itemController = SelectGroupController<int>();
  final groupController = SelectGroupController<String>(
    dark: true,
    lang: LangBadge.ptBR,
  );
  final itemControllerSingle = SelectGroupController<int>(multiple: false);

  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Scaffold(
        bottomNavigationBar: ElevatedButton(
          child: const Padding(
            padding: EdgeInsets.all(10.0),
            child: Text(
              'Reset',
              style: TextStyle(fontSize: 20),
            ),
          ),
          style: ButtonStyle(
            backgroundColor: MaterialStateProperty.all(Colors.blue),
          ),
          onPressed: () {
            itemController.resetValues();
            groupController.resetValues();
            itemControllerSingle.resetValues();
          },
        ),
        body: SingleChildScrollView(
          child: Column(
            children: [
              GroupSelect<String>(
                title: 'With groups items',
                activeColor: Colors.green,
                controller: groupController,
                onChange: (values) {},
                groups: [_groupSelectWithGroup],
              ),
              _groupSelectWithItems,
              _groupSelectSingleWithItems,
            ],
          ),
        ),
      ),
    );
  }

  Group get _groupSelectWithGroup {
    return Group(
      title: 'Grupo 1',
      id: '1',
      items: [
        Item(title: 'Item 1', value: '1', leading: const Icon(Icons.circle)),
        Item(title: 'Item 2', value: '2', leading: const Icon(Icons.circle)),
        Item(title: 'Item 3', value: '3', leading: const Icon(Icons.circle)),
        Item(title: 'Item 4', value: '4', leading: const Icon(Icons.circle)),
        Item(title: 'Item 5', value: '5'),
      ],
    );
  }

  Widget get _groupSelectWithItems {
    return GroupSelect<int>(
      activeColor: Colors.red,
      title: 'With items',
      controller: itemController,
      items: [
        Item(title: 'Item 1', value: 1),
        Item(title: 'Item 2', value: 2),
        Item(title: 'Item 3', value: 3),
        Item(title: 'Item 4', value: 4),
        Item(title: 'Item 5', value: 5),
      ],
    );
  }

  Widget get _groupSelectSingleWithItems {
    return GroupSelect<int>(
      activeColor: Colors.red,
      title: 'Single With items',
      controller: itemControllerSingle,
      items: [
        Item(title: 'Item 1', value: 1),
        Item(title: 'Item 2', value: 2),
        Item(title: 'Item 3', value: 3),
        Item(title: 'Item 4', value: 4),
        Item(title: 'Item 5', value: 5),
      ],
    );
  }
}

以上示例展示了一个带有分组选择、单选和重置功能的完整Flutter应用程序。


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

1 回复

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


当然,下面是一个关于如何在Flutter中使用group_select插件的示例代码。这个插件通常用于实现分组选择功能,比如在一个表单中选择多个选项,这些选项被分组显示。

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

dependencies:
  flutter:
    sdk: flutter
  group_select: ^最新版本号  # 请替换为实际的最新版本号

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

接下来,下面是一个完整的示例代码,展示如何在Flutter应用中使用group_select插件:

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

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

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

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  // 定义分组数据
  final List<GroupData> groupDataList = [
    GroupData(
      title: 'Group 1',
      items: [
        ItemData(value: 'item1_1', text: 'Item 1-1'),
        ItemData(value: 'item1_2', text: 'Item 1-2'),
      ],
    ),
    GroupData(
      title: 'Group 2',
      items: [
        ItemData(value: 'item2_1', text: 'Item 2-1'),
        ItemData(value: 'item2_2', text: 'Item 2-2'),
      ],
    ),
  ];

  // 保存选中的值
  List<String> selectedValues = [];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Group Select Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            // 使用GroupSelect组件
            GroupSelect<String>(
              groupDataList: groupDataList,
              initialSelectedValues: selectedValues,
              onChanged: (newValue) {
                setState(() {
                  selectedValues = newValue;
                });
              },
              itemBuilder: (context, itemData) {
                return ListTile(
                  title: Text(itemData.text),
                  trailing: Checkbox(
                    value: selectedValues.contains(itemData.value),
                    onChanged: (value) {
                      // 这里不能直接调用onChanged,因为我们需要处理分组逻辑
                      // 可以考虑使用一个临时列表来收集变化,然后统一更新
                      // 但为了简单起见,这里直接调用,仅作示例
                      setState(() {
                        if (value) {
                          selectedValues.add(itemData.value);
                        } else {
                          selectedValues.remove(itemData.value);
                        }
                      });
                      // 注意:实际使用中,应该通过某种方式通知GroupSelect组件知道这个变化
                      // 这里为了简化,我们直接调用了父组件的onChanged,这在实际中可能会导致问题
                      // 正确的做法是使用一个中间变量,在结束时统一调用onChanged
                    },
                  ),
                );
              },
            ),
            SizedBox(height: 20),
            Text('Selected Values: $selectedValues'),
          ],
        ),
      ),
    );
  }
}

// GroupData 和 ItemData 类定义,用于存储分组和项的数据
class GroupData {
  final String title;
  final List<ItemData> items;

  GroupData({required this.title, required this.items});
}

class ItemData {
  final String value;
  final String text;

  ItemData({required this.value, required this.text});
}

注意

  1. 在实际使用中,itemBuilder中的CheckboxonChanged回调不能直接调用父组件的onChanged,因为这可能会导致状态管理上的问题。正确的做法是使用一个临时变量来收集所有变化,然后在用户完成所有选择后,统一调用父组件的onChanged
  2. 上述代码为了简化示例,直接在CheckboxonChanged回调中更新了selectedValues并调用了setState,这在实际项目中可能会导致不一致的状态。

这个示例展示了如何使用group_select插件来创建一个分组选择界面,并处理用户的选择。你可以根据自己的需求进一步自定义和扩展这个示例。

回到顶部