Flutter自定义下拉菜单插件flexible_dropdown的使用

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

Flutter自定义下拉菜单插件flexible_dropdown的使用

简介

flexible_dropdown 是一个用于Flutter的自定义下拉菜单插件,提供了丰富的功能和灵活的动画效果。本文将介绍如何在你的Flutter项目中安装并使用这个插件。

功能特性

  • 自定义下拉菜单
  • 自动滚动到选中的项目位置
  • 支持 BarrierShape.headerTrans 来高亮显示下拉按钮上方的内容
  • 允许通过点击或滑动遮罩层关闭下拉菜单,或者通过键盘上的ESC键关闭
  • 提供多种动画类型选择

安装

首先,在你的 pubspec.yaml 文件中添加 flexible_dropdown 作为依赖项:

dependencies:
  flexible_dropdown: ^1.0.6

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

使用示例

以下是一个完整的示例代码,展示了如何使用 flexible_dropdown 插件来创建一个自定义的下拉菜单。

示例代码

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

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

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

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        backgroundColor: Colors.white,
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: SizedBox.expand(
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.center,
            mainAxisAlignment: MainAxisAlignment.start,
            children: [
              const SafeArea(child: SizedBox(height: 15)),
              _buildFlexibleDropdown(),
              const SafeArea(child: SizedBox(height: 15)),
            ],
          ),
        ),
      ),
    );
  }

  // 构建文本按钮
  Widget _buildTextBtn(String title) {
    return Container(
      decoration: BoxDecoration(
        borderRadius: BorderRadius.circular(6),
        color: Colors.blueAccent.withOpacity(.2),
      ),
      child: Padding(
        padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 20),
        child: Text(
          title,
          style: const TextStyle(fontSize: 14, fontWeight: FontWeight.w500),
        ),
      ),
    );
  }

  // 构建下拉菜单
  Widget _buildFlexibleDropdown() {
    return FlexibleDropdown(
      overlayChild: Container(
        height: 160,
        width: double.infinity,
        color: Colors.deepPurple,
      ),
      barrierColor: Colors.black38.withOpacity(.2),
      barrierShape: BarrierShape.headerTrans,
      textDirection: TextDirection.ltr,
      duration: const Duration(milliseconds: 400),
      animationType: AnimationType.scaleY,
      animationAlignment: Alignment.topCenter,
      offset: Offset.zero,
      child: _buildTextBtn('Flexible Dropdown'),
    );
  }
}

关闭下拉菜单

可以通过调用 Navigator.pop(context) 来关闭下拉菜单:

Navigator.pop(context);

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

1 回复

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


当然,下面是一个关于如何在Flutter中使用flexible_dropdown插件创建自定义下拉菜单的示例代码。flexible_dropdown是一个强大的Flutter包,它提供了灵活的下拉菜单功能,并支持自定义样式和行为。

首先,确保你已经在pubspec.yaml文件中添加了flexible_dropdown依赖:

dependencies:
  flutter:
    sdk: flutter
  flexible_dropdown: ^x.y.z  # 请替换为最新版本号

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

接下来,你可以在你的Dart文件中使用FlexibleDropdown组件。以下是一个完整的示例:

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

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  String? selectedValue;

  final List<String> dropdownItems = ['Item 1', 'Item 2', 'Item 3', 'Item 4'];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flexible Dropdown Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            FlexibleDropdown(
              containerDecoration: BoxDecoration(
                borderRadius: BorderRadius.circular(8),
                color: Colors.white,
                boxShadow: [
                  BoxShadow(
                    color: Colors.grey.withOpacity(0.5),
                    spreadRadius: 5,
                    blurRadius: 7,
                    offset: Offset(0, 3), // changes position of shadow
                  ),
                ],
              ),
              items: dropdownItems.map((item) {
                return DropdownMenuItem<String>(
                  value: item,
                  child: Text(item),
                );
              }).toList(),
              value: selectedValue,
              onChanged: (newValue) {
                setState(() {
                  selectedValue = newValue;
                });
              },
              isExpanded: true,
              searchEnabled: true,
              searchDecoration: InputDecoration(
                prefixIcon: Icon(Icons.search),
                border: OutlineInputBorder(),
                labelText: 'Search...',
              ),
              hint: Text('Select an item'),
              dropdownDecoration: BoxDecoration(
                borderRadius: BorderRadius.circular(8),
                color: Colors.blue.shade100,
              ),
              dropdownButtonBuilder: (context, isOpen) {
                return ButtonTheme(
                  alignedDropdown: true,
                  child: ButtonStyleButton(
                    child: Container(
                      decoration: BoxDecoration(
                        borderRadius: BorderRadius.circular(8),
                        border: Border.all(color: Colors.grey),
                      ),
                      child: Text(
                        selectedValue ?? 'Select an item',
                        style: TextStyle(color: Colors.black),
                      ),
                    ),
                    style: ButtonStyle(
                      overlayColor: MaterialStateProperty.all(Colors.blue.shade100),
                    ),
                  ),
                );
              },
            ),
          ],
        ),
      ),
    );
  }
}

代码说明:

  1. 依赖导入:首先导入flexible_dropdown包。
  2. 数据准备:创建一个包含下拉菜单选项的列表dropdownItems
  3. UI布局:使用FlexibleDropdown组件创建下拉菜单。
    • containerDecoration:用于设置下拉菜单容器的装饰。
    • items:下拉菜单项列表。
    • value:当前选中的值。
    • onChanged:当选中项变化时的回调函数。
    • isExpanded:是否展开下拉菜单。
    • searchEnabled:是否启用搜索功能。
    • searchDecoration:搜索输入框的装饰。
    • hint:当下拉菜单没有选中项时显示的提示文本。
    • dropdownDecoration:下拉菜单弹出层的装饰。
    • dropdownButtonBuilder:自定义下拉菜单按钮的构建器。

这个示例展示了如何使用flexible_dropdown包创建一个功能丰富、样式自定义的下拉菜单。你可以根据需要进一步调整样式和功能。

回到顶部