Flutter下拉选择按钮插件dropdown_button_plus的使用

Flutter下拉选择按钮插件dropdown_button_plus的使用

Getting started 🍺:

在你的pubspec.yaml文件中添加以下依赖:

dependencies:
  dropdown_button_plus: any

import

导入插件包:

import 'package:dropdown_button_plus/dropdown_plus.dart' as plus;

Basic:

使用方式与Flutter SDK中的DropdownButton相同。

plus.DropdownView<String>(
  items: filters, // 下拉选项列表
  itemPadding: EdgeInsets.zero, // 设置项内边距为零
  itemBuilder: (_, index, select) => ItemMenuString(
    label: filters[index], // 每个选项的标签
    select: select, // 是否选中
    showIndicator: false, // 不显示指示器
    mainAxisAlignment: MainAxisAlignment.center, // 主轴居中对齐
  ),
  selectedItemBuilder: (_, index, select) => ItemMenuHeader(
    label: filters[index], // 当前选中项的标签
  ),
),

Plus :

1. 下拉按钮带阴影
plus.DropdownView<String>(
  forceWidth: true, // 强制宽度
  isDropdown: true, // 是否为下拉模式
  isOutsideShadow: true, // 是否显示外部阴影
  isPinnedSelected: false, // 是否固定选中项
  items: filters, // 下拉选项列表
  itemBuilder: (_, index, select) => ItemMenuString(
    label: filters[index], // 每个选项的标签
    select: select, // 是否选中
  ),
  selectedItemBuilder: (_, index, select) => ItemMenuHeader(
    label: '综合排序', // 当前选中项的标签
    select: select, // 是否选中
  ),
),

效果展示: plus basic

2. 自定义样式
SizedBox(
  height: kMinInteractiveDimension, // 最小交互尺寸
  child: DropdownView<String>(
    forceWidth: true, // 强制宽度
    isDropdown: true, // 是否为下拉模式
    isOutsideShadow: true, // 是否显示外部阴影
    isPinnedSelected: false, // 是否固定选中项
    itemPadding: EdgeInsets.zero, // 设置项内边距为零
    itemHeight: MediaQuery.of(context).size.height / 2, // 设置项高度
    items: const [''], // 下拉选项列表
    itemBuilder: (_, index, select) => ItemMenuOption(
      onChanged: widget.onOption, // 自定义事件处理
    ),
    selectedItemBuilder: (_, index, select) => ItemMenuHeader(
      label: '对账单', // 当前选中项的标签
      select: select, // 是否选中
    ),
  ),
),

效果展示: plus customize

完整示例代码

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

import 'dart:developer';

import 'package:dropdown_button_plus/dropdown_plus.dart' as plus;
import 'package:example/constants.dart';
import 'package:example/widget/dropdown.dart';
import 'package:flutter/material.dart';

import 'widget/menu.dart';

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        platform: TargetPlatform.iOS,
        primarySwatch: Colors.green,
        backgroundColor: Colors.white,
        scaffoldBackgroundColor: const Color(0xF5F5F5F5),
      ),
      home: const DropdownPage(title: 'DropdownButton Plus'),
    );
  }
}

/// Plus: [DropdownPlusView]
/// Flutter SDK Material : [DropdownButton]
class DropdownPage extends StatefulWidget {
  const DropdownPage({Key? key, required this.title}) : super(key: key);
  final String title;

  [@override](/user/override)
  State<DropdownPage> createState() => _DropdownPageState();
}

class _DropdownPageState extends State<DropdownPage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text(widget.title), elevation: 0),
      body: SingleChildScrollView(
        padding: const EdgeInsets.symmetric(vertical: 8),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            /// Basic Flutter SDK Material DropdownButton
            const Padding(
              padding: EdgeInsets.all(16),
              child: Text(
                'Basic: DropdownButton',
                style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
              ),
            ),

            Material(
              color: Theme.of(context).backgroundColor,
              child: Row(
                mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                children: [
                  plus.DropdownView<String>(
                    items: filterSort, // 下拉选项列表
                    itemPadding: EdgeInsets.zero, // 设置项内边距为零
                    itemBuilder: (_, index, select) => ItemMenuString(
                      label: filterSort[index], // 每个选项的标签
                      select: select, // 是否选中
                      showIndicator: false, // 不显示指示器
                      mainAxisAlignment: MainAxisAlignment.center, // 主轴居中对齐
                    ),
                    selectedItemBuilder: (_, index, select) => ItemMenuHeader(
                      label: filterSort[index], // 当前选中项的标签
                      select: select, // 是否选中
                    ),
                    hintBuilder: (context, focus) => hintWidgetBuilder(
                      context,
                      focus,
                      'Dropdown',
                    ),
                  ),
                  plus.DropdownView<String>(
                    isDropdown: true, // 是否为下拉模式
                    items: filterStatus, // 下拉选项列表
                    itemPadding: EdgeInsets.zero, // 设置项内边距为零
                    itemBuilder: (_, index, select) => ItemMenuString(
                      label: filterStatus[index], // 每个选项的标签
                      select: select, // 是否选中
                      showIndicator: false, // 不显示指示器
                      mainAxisAlignment: MainAxisAlignment.center, // 主轴居中对齐
                    ),
                    selectedItemBuilder: (_, index, select) => ItemMenuHeader(
                      label: filterStatus[index], // 当前选中项的标签
                      select: select, // 是否选中
                    ),
                    hintBuilder: (context, focus) => hintWidgetBuilder(
                      context,
                      focus,
                      'Pinned',
                    ),
                  ),
                ],
              ),
            ),

            /// Plus
            const Padding(
              padding: EdgeInsets.all(16),
              child: Text(
                'Plus:',
                style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
              ),
            ),
            DropdownPlusView(
              onType: _onType,
              onOption: _onOption,
              onStatus: _onStatus,
            ),
          ],
        ),
      ),
    );
  }

  void _onType(value) {
    log('$value');
  }

  void _onStatus(value) async {
    log('$value');
  }

  void _onOption(value) {
    log('$value');
  }
}

更多关于Flutter下拉选择按钮插件dropdown_button_plus的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


dropdown_button_plus 是一个 Flutter 插件,它提供了比 Flutter 自带的 DropdownButton 更丰富的功能和自定义选项。使用 dropdown_button_plus,你可以轻松地创建具有更多样式和交互功能的下拉选择按钮。

安装

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

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

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

基本用法

以下是一个简单的示例,展示了如何使用 dropdown_button_plus 创建一个基本的下拉选择按钮:

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

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

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

主要属性

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

自定义样式

你可以通过设置各种属性来自定义下拉按钮的外观和行为。例如,你可以更改图标、调整菜单的最大高度、设置下拉菜单的背景颜色等。

DropdownButtonPlus(
  items: [
    DropdownMenuItem(value: 'Option 1', child: Text('Option 1')),
    DropdownMenuItem(value: 'Option 2', child: Text('Option 2')),
    DropdownMenuItem(value: 'Option 3', child: Text('Option 3')),
  ],
  onChanged: (value) {
    print('Selected: $value');
  },
  hint: Text('Select an option'),
  icon: Icon(Icons.arrow_drop_down),
  iconSize: 24.0,
  iconEnabledColor: Colors.blue,
  iconDisabledColor: Colors.grey,
  elevation: 8,
  style: TextStyle(color: Colors.black, fontSize: 16),
  underline: Container(
    height: 2,
    color: Colors.blueAccent,
  ),
  isExpanded: true,
  itemHeight: 48.0,
  dropdownColor: Colors.white,
  menuMaxHeight: 200.0,
);
回到顶部