Flutter分组选择插件grouped_checkbox的使用

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

Flutter分组选择插件grouped_checkbox的使用

概述

GroupedCheckbox 是一个用于在Flutter应用中显示复选框列表的插件。它支持多种布局方式和自定义选项,适用于需要分组选择功能的场景。

功能特性

  • 支持泛型数据类型:可以处理不同类型的数据。
  • 多种布局方式:支持垂直、水平和Wrap(自动换行)三种布局。
  • 禁用状态支持:可以设置某些项为不可选状态。
  • 状态变化回调:提供回调函数以处理选择状态的变化。

安装

要使用 grouped_checkbox 插件,首先需要将其添加到 pubspec.yaml 文件的依赖项中:

dependencies:
  grouped_checkbox: 2.0.0

使用示例

以下是一个完整的示例代码,展示了如何在Flutter应用中使用 GroupedCheckbox 插件。该示例包括垂直、水平和Wrap三种布局方式,并且展示了如何处理选择状态的变化。

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Grouped Checkbox Demo',
      home: MyHomePage(title: 'Grouped Checkbox Demo'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, this.title}) : super(key: key);
  final String? title;

  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  // 定义颜色项列表
  final List<ColorItem> allItemList = [
    ColorItem('Red', Colors.red),
    ColorItem('Green', Colors.green),
    ColorItem('Blue', Colors.blue),
    ColorItem('Yellow', Colors.yellow),
    ColorItem('Black', Colors.black),
    ColorItem('Violet', Colors.purple),
  ];

  // 初始化已选中的项
  List<ColorItem> selectedVerticalItems = [];
  List<ColorItem> selectedHorizontalItems = [];
  List<ColorItem> selectedWrapItems = [];

  [@override](/user/override)
  void initState() {
    super.initState();
    // 初始化部分已选中的项
    selectedVerticalItems = [allItemList[2], allItemList[3]];
    selectedHorizontalItems = [allItemList[3], allItemList[4]];
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.blue,
        title: Text(widget.title!, style: TextStyle(color: Colors.white)),
      ),
      body: SingleChildScrollView(
        child: Column(
          children: <Widget>[
            // 垂直布局示例
            buildCheckboxSection(
                'VERTICAL ORIENTATION EXAMPLE',
                CheckboxOrientation.vertical,
                selectedVerticalItems,
                updateVerticalItems,
                [allItemList[0]]),
            Divider(height: 2.0),
            // 水平布局示例
            buildCheckboxSection(
                'HORIZONTAL ORIENTATION EXAMPLE',
                CheckboxOrientation.horizontal,
                selectedHorizontalItems,
                updateHorizontalItems,
                [allItemList[1]]),
            Divider(height: 2.0),
            // Wrap布局示例
            Container(
              decoration: BoxDecoration(
                  border: Border.all(color: Colors.blue),
                  borderRadius: BorderRadius.all(Radius.circular(8.0))),
              margin: EdgeInsets.only(left: 15.0, right: 15.0, top: 15.0),
              height: MediaQuery.of(context).size.height / 4,
              width: MediaQuery.of(context).size.width,
              child: buildCheckboxSection(
                  'WRAP ORIENTATION EXAMPLE',
                  CheckboxOrientation.wrap,
                  selectedWrapItems,
                  updateWrapItems,
                  [allItemList[2]]),
            ),
            SizedBox(height: 50.0),
          ],
        ),
      ),
    );
  }

  // 更新垂直布局的选择项
  void updateVerticalItems(List<ColorItem> newItems) {
    setState(() {
      selectedVerticalItems = newItems;
    });
  }

  // 更新水平布局的选择项
  void updateHorizontalItems(List<ColorItem> newItems) {
    setState(() {
      selectedHorizontalItems = newItems;
    });
  }

  // 更新Wrap布局的选择项
  void updateWrapItems(List<ColorItem> newItems) {
    setState(() {
      selectedWrapItems = newItems;
    });
  }

  // 构建复选框部分
  Widget buildCheckboxSection(
      String title,
      CheckboxOrientation orientation,
      List<ColorItem> selectedItems,
      Function(List<ColorItem>) updateFunction,
      List<ColorItem> disabledItems) {
    return Padding(
      padding: const EdgeInsets.only(top: 15.0, bottom: 15.0),
      child: Column(
        children: <Widget>[
          // 标题
          Text(
            title,
            style: TextStyle(color: Colors.blue, fontSize: 15.0),
          ),
          // 复选框组件
          GroupedCheckbox<ColorItem>(
            itemList: allItemList, // 所有项
            checkedItemList: selectedItems, // 已选中的项
            disabled: disabledItems, // 禁用的项
            onChanged: (itemList) {
              updateFunction(itemList!); // 回调函数
            },
            orientation: orientation, // 布局方式
            checkColor: Colors.purpleAccent, // 选中时的勾选颜色
            activeColor: Colors.lightBlue, // 选中时的背景颜色
            itemWidgetBuilder: (item) => Text(
              item.name,
              style: TextStyle(color: item.color), // 自定义项的显示样式
            ),
          ),
          SizedBox(height: 5.0),
          // 显示已选中的项
          Text(
            'Selected Colors: ${selectedItems.map((item) => item.name).join(', ')}',
            style: TextStyle(color: Colors.blue),
          ),
        ],
      ),
    );
  }
}

// 颜色项类
class ColorItem {
  String name;
  Color color;

  ColorItem(this.name, this.color);
}

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

1 回复

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


当然,下面是一个关于如何在Flutter中使用grouped_checkbox插件来实现分组选择功能的代码示例。这个插件允许你在Flutter应用中创建带有分组功能的复选框。

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

dependencies:
  flutter:
    sdk: flutter
  grouped_checkbox: ^x.y.z  # 请将x.y.z替换为实际的最新版本号

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

接下来,是一个简单的示例代码,展示如何使用grouped_checkbox

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

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  // 定义分组数据
  final List<GroupedCheckboxData> groupedData = [
    GroupedCheckboxData(
      header: "Group 1",
      items: [
        GroupedCheckboxItem(title: "Item 1-1", value: "1-1"),
        GroupedCheckboxItem(title: "Item 1-2", value: "1-2"),
      ],
    ),
    GroupedCheckboxData(
      header: "Group 2",
      items: [
        GroupedCheckboxItem(title: "Item 2-1", value: "2-1"),
        GroupedCheckboxItem(title: "Item 2-2", value: "2-2"),
      ],
    ),
  ];

  // 用于存储选中的值
  List<String> selectedValues = [];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Grouped Checkbox Example"),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: GroupedCheckbox(
          data: groupedData,
          selectedValues: selectedValues,
          onValueChanged: (List<String> values) {
            setState(() {
              selectedValues = values;
            });
          },
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 打印选中的值
          print("Selected Values: $selectedValues");
        },
        tooltip: 'Print Selected Values',
        child: Icon(Icons.print),
      ),
    );
  }
}

代码解释

  1. 依赖导入

    • 导入flutter/material.dartgrouped_checkbox/grouped_checkbox.dart
  2. 数据准备

    • 使用GroupedCheckboxData类定义分组数据,每个分组包含一个header和多个GroupedCheckboxItem
  3. 状态管理

    • 使用StatefulWidget_MyHomePageState来管理选中的值。
    • selectedValues列表用于存储当前选中的值。
  4. 构建UI

    • 使用GroupedCheckbox小部件来显示分组复选框。
    • onValueChanged回调函数用于更新选中的值。
  5. 浮动按钮

    • 添加一个浮动按钮,点击后打印选中的值。

运行这个示例代码,你将看到一个包含两个分组复选框的界面,每个分组有两个选项。你可以选中或取消选中这些选项,并通过点击浮动按钮来打印当前选中的值。

这个示例应该能帮助你理解如何在Flutter中使用grouped_checkbox插件来实现分组选择功能。

回到顶部