Flutter高级下拉菜单插件flutter_advanced_drop_down的使用

Flutter 高级下拉菜单插件 flutter_advanced_drop_down 的使用

特性

  • 可自定义的外观,支持 BoxDecoration
  • 可选的搜索功能
  • 支持创建新项目的“添加”按钮
  • 支持加载指示器(全列表和加载更多)
  • 可自定义的项目构建器
  • 可选的“无选择”选项
  • 项目选择回调
  • 支持异步数据加载
  • 支持使用值通知器进行搜索

开始使用

要使用此包,请在你的 pubspec.yaml 文件中添加 flutter_advanced_dropdown 作为依赖项。

dependencies:
  flutter_advanced_dropdown: ^1.0.0

然后,在 Dart 代码中导入该包:

import 'package:flutter_advanced_dropdown/flutter_advanced_dropdown.dart';

使用示例

以下是一个基本示例,展示如何使用 FlutterAdvancedDropDown 小部件:

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

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: '动态下拉菜单示例',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: '动态下拉菜单示例'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  final String title;

  const MyHomePage({super.key, required this.title});

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

class _MyHomePageState extends State<MyHomePage> {
  // 初始化静态列表
  final staticList = List<String>.generate(100, (index) => '项目 $index');

  // 存储选中的值
  String? selectedValue;

  // 值通知器用于控制加载状态
  final loading = ValueNotifier<bool>(false);
  final loadingMore = ValueNotifier<bool>(false);
  final listNotifier = ValueNotifier<List<String>>([]);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            const Text(
              '请选择一个选项:',
            ),
            FlutterAdvancedDropDown<String>(
              builder: (item, _) => Text(item), // 项目构建器
              onOpen: () {
                loading.value = true;
                Future.delayed(
                  const Duration(seconds: 2),
                  () {
                    listNotifier.value = staticList;
                    loading.value = false;
                  },
                );
              },
              isLoadingAll: loading, // 全部加载状态
              isLoadingMore: loadingMore, // 加载更多状态
              listNotifier: listNotifier, // 列表通知器
              titleWidget: const Text('请选择一个选项:'), // 标题
              label: '请选择一个选项', // 标签
              searchBarBuilder: (p0) => TextField(onChanged: (value) async {
                if (value.isEmpty) {
                  listNotifier.value = staticList;
                  return;
                }
                loadingMore.value = true;
                await Future.delayed(
                  const Duration(seconds: 2),
                  () {
                    listNotifier.value = staticList
                        .where((element) => element.contains(value))
                        .toList();
                  },
                );
                loadingMore.value = false;
              }), // 搜索栏构建器
              onSelect: (p0, p1) {
                setState(() {
                  selectedValue = p0;
                });
              }, // 选择回调
              decoration: BoxDecoration(
                color: Colors.white,
                borderRadius: BorderRadius.circular(10),
                border: Border.all(color: Colors.grey),
              ), // 装饰
              fullLoadingWidgetPlaceHolder: const Center(
                child: CircularProgressIndicator(
                  color: Colors.blue,
                ),
              ), // 全部加载指示器
              loadMoreWidgetPlaceHolder: const LinearProgressIndicator(
                color: Colors.blue,
              ), // 加载更多指示器
            ),
            const SizedBox(height: 20),
            Text(
              '选中的值: ${selectedValue ?? "无"}',
              style: Theme.of(context).textTheme.headlineMedium,
            ),
          ],
        ),
      ),
    );
  }

  [@override](/user/override)
  void initState() {
    super.initState();

    loading.value = true;
    Future.delayed(const Duration(seconds: 2)).then((value) {
      loading.value = false;
      listNotifier.value = staticList;
    });
  }
}

更多关于Flutter高级下拉菜单插件flutter_advanced_drop_down的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter高级下拉菜单插件flutter_advanced_drop_down的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flutter_advanced_dropdown 是一个 Flutter 插件,它提供了一个高度可定制的下拉菜单组件,适用于需要更复杂交互和样式的场景。这个插件可以帮助你创建比默认 DropdownButton 更高级的下拉菜单。

安装

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

dependencies:
  flutter:
    sdk: flutter
  flutter_advanced_dropdown: ^1.0.0  # 请使用最新版本

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

基本用法

以下是一个简单的例子,展示了如何使用 flutter_advanced_dropdown

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Advanced Dropdown Example'),
        ),
        body: Center(
          child: AdvancedDropdown(
            items: [
              DropdownMenuItem(child: Text('Option 1'), value: '1'),
              DropdownMenuItem(child: Text('Option 2'), value: '2'),
              DropdownMenuItem(child: Text('Option 3'), value: '3'),
            ],
            onChanged: (value) {
              print('Selected: $value');
            },
            hint: Text('Select an option'),
          ),
        ),
      ),
    );
  }
}

参数说明

AdvancedDropdown 组件提供了多个参数,允许你自定义下拉菜单的行为和外观。以下是一些常用的参数:

  • items: 一个 List<DropdownMenuItem>,表示下拉菜单中的选项。
  • onChanged: 当用户选择一个选项时调用的回调函数。
  • hint: 当下拉菜单未选择任何选项时显示的提示文本。
  • value: 当前选中的值。
  • disabledHint: 当下拉菜单被禁用时显示的提示文本。
  • icon: 下拉菜单右侧的图标。
  • iconSize: 图标的大小。
  • isDense: 是否减少下拉菜单的高度。
  • isExpanded: 是否将下拉菜单的宽度扩展到父容器的宽度。
  • itemHeight: 每个选项的高度。
  • menuMaxHeight: 下拉菜单的最大高度。
  • elevation: 下拉菜单的阴影高度。
  • style: 下拉菜单文本的样式。
  • dropdownColor: 下拉菜单的背景颜色。
  • underline: 下拉菜单底部的下划线样式。
  • selectedItemBuilder: 自定义选中项的显示方式。

自定义样式

你可以通过 decoration 参数来自定义下拉菜单的样式。例如:

AdvancedDropdown(
  items: [
    DropdownMenuItem(child: Text('Option 1'), value: '1'),
    DropdownMenuItem(child: Text('Option 2'), value: '2'),
    DropdownMenuItem(child: Text('Option 3'), value: '3'),
  ],
  onChanged: (value) {
    print('Selected: $value');
  },
  hint: Text('Select an option'),
  decoration: InputDecoration(
    border: OutlineInputBorder(),
    filled: true,
    fillColor: Colors.grey[200],
  ),
)
回到顶部