Flutter多项选择插件multi_select_item的使用

Flutter多项选择插件multi_select_item的使用

multi_select_item 是一个用于在 Flutter 的 GridViewListView 中实现多选功能的插件。它允许用户通过点击或长按列表项来选择或取消选择项目。

使用步骤

1. 引入依赖

首先,在 pubspec.yaml 文件中添加 multi_select_item 依赖:

dependencies:
  multi_select_item: ^1.0.0

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

2. 初始化控制器

在你的页面中定义一个 MultiSelectController 实例,并设置其长度以匹配你的数据源。

MultiSelectController controller = MultiSelectController();

// 初始化数据源
List mainList = [
  {"key": "1"},
  {"key": "2"},
  {"key": "3"},
  {"key": "4"}
];

[@override](/user/override)
void initState() {
  super.initState();
  controller.set(mainList.length); // 设置控制器长度
}

3. 使用 MultiSelectItem

在构建列表时,将 MultiSelectItem 包裹在每个列表项中。通过 isSelecting 参数控制是否处于多选模式,并通过 onSelected 处理用户的选择操作。

ListView.builder(
  itemCount: mainList.length,
  itemBuilder: (context, index) {
    return MultiSelectItem(
      isSelecting: controller.isSelecting, // 是否处于多选模式
      onSelected: () {
        setState(() {
          controller.toggle(index); // 切换选中状态
        });
      },
      child: Container(
        child: ListTile(
          title: Text("Title ${mainList[index]['key']}"), // 显示标题
          subtitle: Text("Description ${mainList[index]['key']}"), // 显示描述
        ),
        decoration: controller.isSelected(index) // 根据选中状态改变背景颜色
            ? BoxDecoration(color: Colors.grey[300])
            : null,
      ),
    );
  },
),

4. 获取选中的索引

可以通过 controller.selectedIndexes 获取当前选中的索引列表。

print(controller.selectedIndexes.toString()); // 输出选中的索引

完整示例代码

以下是一个完整的示例代码,展示了如何使用 multi_select_item 插件来实现多选功能。

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

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

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

class MyHomePage extends StatefulWidget {
  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  List mainList = [];
  MultiSelectController controller = MultiSelectController();

  [@override](/user/override)
  void initState() {
    super.initState();
    mainList.addAll([
      {"key": "1"},
      {"key": "2"},
      {"key": "3"},
      {"key": "4"}
    ]);
    controller.set(mainList.length);
  }

  void addItem() {
    setState(() {
      mainList.add({"key": mainList.length + 1});
      controller.set(mainList.length);
    });
  }

  void deleteItems() {
    var selectedIndexes = controller.selectedIndexes;
    selectedIndexes.sort((a, b) => b.compareTo(a)); // 按降序排序
    selectedIndexes.forEach((index) {
      mainList.removeAt(index);
    });
    setState(() {
      controller.set(mainList.length);
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Selected ${controller.selectedIndexes.length}'),
        actions: controller.isSelecting
            ? [
                IconButton(
                  icon: Icon(Icons.select_all),
                  onPressed: () {
                    setState(() {
                      controller.toggleAll();
                    });
                  },
                ),
                IconButton(
                  icon: Icon(Icons.delete),
                  onPressed: deleteItems,
                ),
              ]
            : [],
      ),
      body: ListView.builder(
        itemCount: mainList.length,
        itemBuilder: (context, index) {
          return MultiSelectItem(
            isSelecting: controller.isSelecting,
            onSelected: () {
              setState(() {
                controller.toggle(index);
              });
            },
            child: Container(
              child: ListTile(
                title: Text("Title ${mainList[index]['key']}"),
                subtitle: Text("Description ${mainList[index]['key']}"),
              ),
              decoration: controller.isSelected(index)
                  ? BoxDecoration(color: Colors.grey[300])
                  : null,
            ),
          );
        },
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: addItem,
        child: Icon(Icons.add),
      ),
    );
  }
}
1 回复

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


multi_select_item 是一个用于在 Flutter 中实现多项选择的插件。它允许用户从列表中选择多个项目,并且可以轻松地集成到你的应用中。以下是如何使用 multi_select_item 插件的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  multi_select_item: ^1.0.0  # 请检查最新版本

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

2. 导入包

在你的 Dart 文件中导入 multi_select_item 包:

import 'package:multi_select_item/multi_select_item.dart';

3. 创建 MultiSelectController

MultiSelectController 用于管理选择状态。你可以在你的 State 类中创建一个 MultiSelectController 实例:

class _MyHomePageState extends State<MyHomePage> {
  MultiSelectController multiSelectController = MultiSelectController();
  
  [@override](/user/override)
  void initState() {
    super.initState();
    multiSelectController.disableEditingWhenNoneSelected = true;
  }
  
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Multi Select Example'),
      ),
      body: ListView.builder(
        itemCount: 10,
        itemBuilder: (context, index) {
          return MultiSelectItem(
            isSelecting: multiSelectController.isSelecting,
            onSelected: () {
              setState(() {
                multiSelectController.toggle(index);
              });
            },
            child: ListTile(
              title: Text('Item $index'),
              selected: multiSelectController.isSelected(index),
            ),
          );
        },
      ),
    );
  }
}

4. 使用 MultiSelectItem

ListView.builder 或任何其他列表构建器中,使用 MultiSelectItem 来包装每个列表项。MultiSelectItem 需要以下参数:

  • isSelecting: 一个布尔值,表示是否处于选择模式。通常使用 multiSelectController.isSelecting
  • onSelected: 当用户选择或取消选择项目时调用的回调函数。通常使用 multiSelectController.toggle(index) 来切换选择状态。
  • child: 实际的列表项内容。

5. 控制选择模式

你可以通过 multiSelectController 来控制选择模式。例如,你可以通过长按列表项来进入选择模式:

GestureDetector(
  onLongPress: () {
    setState(() {
      multiSelectController.startEditing();
    });
  },
  child: ListView.builder(
    itemCount: 10,
    itemBuilder: (context, index) {
      return MultiSelectItem(
        isSelecting: multiSelectController.isSelecting,
        onSelected: () {
          setState(() {
            multiSelectController.toggle(index);
          });
        },
        child: ListTile(
          title: Text('Item $index'),
          selected: multiSelectController.isSelected(index),
        ),
      );
    },
  ),
);

6. 获取选中的项目

你可以通过 multiSelectController.selectedIndexes 来获取所有选中的项目索引:

List<int> selectedIndexes = multiSelectController.selectedIndexes;

7. 结束选择模式

你可以通过调用 multiSelectController.stopEditing() 来结束选择模式:

setState(() {
  multiSelectController.stopEditing();
});

完整示例

以下是一个完整的示例,展示了如何使用 multi_select_item 插件:

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

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

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

class MyHomePage extends StatefulWidget {
  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  MultiSelectController multiSelectController = MultiSelectController();

  [@override](/user/override)
  void initState() {
    super.initState();
    multiSelectController.disableEditingWhenNoneSelected = true;
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Multi Select Example'),
        actions: [
          IconButton(
            icon: Icon(Icons.delete),
            onPressed: () {
              setState(() {
                multiSelectController.selectedIndexes.forEach((index) {
                  // 处理删除操作
                });
                multiSelectController.stopEditing();
              });
            },
          ),
        ],
      ),
      body: GestureDetector(
        onLongPress: () {
          setState(() {
            multiSelectController.startEditing();
          });
        },
        child: ListView.builder(
          itemCount: 10,
          itemBuilder: (context, index) {
            return MultiSelectItem(
              isSelecting: multiSelectController.isSelecting,
              onSelected: () {
                setState(() {
                  multiSelectController.toggle(index);
                });
              },
              child: ListTile(
                title: Text('Item $index'),
                selected: multiSelectController.isSelected(index),
              ),
            );
          },
        ),
      ),
    );
  }
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!