Flutter多级联动选择插件multiselect_nested的使用

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

Flutter多级联动选择插件multiselect_nested的使用

Multi Select Nested 是一个支持Flutter中嵌套选项的包。它允许开发者创建单选或复选的下拉菜单,这些菜单可以包含多层级的选项,并且提供了丰富的自定义选项。

Features

  • 单选和多选支持嵌套选项
  • 丰富的选项和高度可定制性

Getting Started

添加依赖

首先,在您的pubspec.yaml文件中添加multiselect_nested作为依赖:

dependencies:
  flutter:
    sdk: flutter
  multiselect_nested: # 使用最新版本    

然后在您的Dart文件中导入这个库:

import 'package:multiselect_nested/multiselect_nested.dart';

如果您需要,还可以创建一个MultiSelectNestedController来传递给组件作为属性:

import 'package:multiselect_nested/models/multiselect_nested.dart';

MultiSelectNestedController multiSelectController = MultiSelectNestedController();

另外,您也可以导入模型multiselect_nested_item,这有助于在传递选项和预选项目时使用正确的接口:

import 'package:multiselect_nested/models/multiselect_nested_item.dart';

示例代码

下面是一个完整的示例,展示了如何使用MultiSelectNested组件,包括从JSON文件加载数据、设置控制器、以及响应用户的选择。

import 'package:flutter/material.dart';
import 'package:flutter/services.dart' show rootBundle;
import 'package:multiselect_nested/models/multiselect_nested_controller.dart';
import 'package:multiselect_nested/models/multiselect_nested_item.dart';
import 'package:multiselect_nested/multiselect_nested.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

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

class Home extends StatefulWidget {
  const Home({Key? key}) : super(key: key);

  @override
  State<Home> createState() => _HomeState();
}

class _HomeState extends State<Home> {
  List<MultiSelectNestedItem> selected = [];
  MultiSelectNestedController multiSelectController = MultiSelectNestedController();

  Future<List<MultiSelectNestedItem>> getJson() async {
    var data = await rootBundle.loadString('assets/example_data.json');
    return multiSelectNestedFromJson(data);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Padding(
        padding: const EdgeInsets.symmetric(horizontal: 15),
        child: Center(
          child: SingleChildScrollView(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              mainAxisSize: MainAxisSize.max,
              children: [
                FutureBuilder<List<MultiSelectNestedItem>>(
                  future: getJson(),
                  builder: (BuildContext context, AsyncSnapshot<List<MultiSelectNestedItem>> snapshot) {
                    switch (snapshot.connectionState) {
                      case ConnectionState.waiting:
                        return const Text('Loading....');
                      default:
                        if (snapshot.hasError) {
                          return Text('Error: ${snapshot.error}');
                        } else {
                          return Column(
                            children: [
                              MultiSelectNested(
                                controller: multiSelectController,
                                options: snapshot.data!,
                                selectedValues: selected,
                                isAnimatedContainer: false,
                                liveUpdateValues: false,
                                checkParentWhenChildIsSelected: true,
                                setSelectedValues: (List<MultiSelectNestedItem> newValues) {
                                  setState(() {
                                    selected = newValues;
                                  });
                                },
                              ),
                            ],
                          );
                        }
                    }
                  },
                ),
                const SizedBox(height: 20,),
                ElevatedButton(
                  onPressed: () {
                    print('values ${multiSelectController.getSelectedItems()} ${multiSelectController.getSelectedItems().length}');
                    setState(() {
                      selected = multiSelectController.getSelectedItems();
                    });
                  },
                  child: const Text('Update and Get Values'),
                ),
                ElevatedButton(
                  onPressed: () {
                    multiSelectController.clearValues();
                  },
                  child: const Text('Clear Values'),
                ),
                ElevatedButton(
                  onPressed: () {
                    multiSelectController.expandContainer();
                  },
                  child: const Text('Programmatically Expand Container'),
                ),
                const SizedBox(height: 20,),
                selected.isNotEmpty
                    ? Column(
                        mainAxisAlignment: MainAxisAlignment.start,
                        children: selected.map((MultiSelectNestedItem item) {
                          return Text(item.name);
                        }).toList(),
                      )
                    : const Text('Still No Selected Values..')
              ],
            ),
          ),
        ),
      ),
    );
  }
}

这段代码创建了一个简单的Flutter应用程序,其中包含一个多级联动选择器。它从资产文件中加载了示例数据,并允许用户通过按钮更新所选值、清除所有选择或编程方式展开容器。此外,当用户选择了某些项后,它们的名字会被显示出来。

请注意,为了使此代码正常工作,您还需要确保您的项目中有名为example_data.json的文件位于assets/目录下,并且该文件包含了符合MultiSelectNestedItem格式的数据。


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

1 回复

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


当然,以下是一个关于如何在Flutter中使用multiselect_nested插件实现多级联动选择的代码示例。multiselect_nested插件允许用户从嵌套的列表中进行多选。

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

dependencies:
  flutter:
    sdk: flutter
  multiselect_nested: ^0.4.0  # 请检查最新版本号并替换

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

接下来是一个简单的示例代码,展示如何使用multiselect_nested插件:

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

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  List<MultiSelectNestedItem> items = [
    MultiSelectNestedItem(
      title: 'Category 1',
      id: '1',
      children: [
        MultiSelectNestedItem(title: 'Subcategory 1.1', id: '1.1'),
        MultiSelectNestedItem(title: 'Subcategory 1.2', id: '1.2'),
      ],
    ),
    MultiSelectNestedItem(
      title: 'Category 2',
      id: '2',
      children: [
        MultiSelectNestedItem(title: 'Subcategory 2.1', id: '2.1'),
        MultiSelectNestedItem(
          title: 'Subcategory 2.2',
          id: '2.2',
          children: [
            MultiSelectNestedItem(title: 'Subsubcategory 2.2.1', id: '2.2.1'),
          ],
        ),
      ],
    ),
  ];

  List<String> selectedItems = [];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('MultiSelect Nested Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Expanded(
              child: MultiSelectNested(
                items: items,
                initialSelectedValues: selectedItems,
                onSelectionChanged: (List<String> values) {
                  setState(() {
                    selectedItems = values;
                  });
                },
              ),
            ),
            SizedBox(height: 20),
            Text('Selected Items:'),
            Wrap(
              spacing: 10,
              runSpacing: 10,
              children: selectedItems.map((item) => Chip(
                label: Text(item),
                backgroundColor: Colors.blueAccent,
              )).toList(),
            ),
          ],
        ),
      ),
    );
  }
}

代码解释

  1. 依赖导入:在pubspec.yaml文件中添加multiselect_nested依赖。
  2. 数据准备:定义一个包含多级联动数据的List<MultiSelectNestedItem>。每个MultiSelectNestedItem可以包含子项,形成一个嵌套结构。
  3. UI布局
    • 使用Scaffold构建主页面。
    • 使用MultiSelectNested组件显示多级联动选择列表。
    • 通过onSelectionChanged回调更新选中的值。
    • 使用Chip组件显示选中的项。

这样,你就可以在Flutter应用中实现一个具有多级联动选择功能的界面了。你可以根据需要进一步自定义和扩展这个示例。

回到顶部