Flutter交互式下拉菜单插件reactive_dropdown_menu的使用

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

Flutter交互式下拉菜单插件reactive_dropdown_menu的使用

reactive_dropdown_menu 是一个围绕 DropdownMenu 构建的包装器,用于与 reactive_forms 一起使用。当前文档还在编写中,可以查看示例文件夹中的示例。

示例代码

import 'package:flutter/material.dart';
import 'package:reactive_dropdown_menu/reactive_dropdown_menu.dart';
import 'package:reactive_forms/reactive_forms.dart';

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

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

  // 构建表单
  FormGroup buildForm() => fb.group({
        'input': FormControl<ColorLabel>(value: null),
      });

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: Scaffold(
        appBar: AppBar(),
        body: SafeArea(
          child: SingleChildScrollView(
            physics: const BouncingScrollPhysics(),
            padding: const EdgeInsets.symmetric(
              horizontal: 20.0,
              vertical: 20.0,
            ),
            child: ReactiveFormBuilder(
              form: buildForm,
              builder: (context, form, child) {
                return Column(
                  children: [
                    // 下拉菜单组件
                    ReactiveDropdownMenu<ColorLabel, ColorLabel>(
                      formControlName: 'input',
                      dropdownMenuEntries: ColorLabel.values
                          .map<DropdownMenuEntry<ColorLabel>>(
                              (ColorLabel color) {
                            return DropdownMenuEntry<ColorLabel>(
                              value: color,
                              label: color.label,
                              enabled: color.label != 'Grey',
                              style: MenuItemButton.styleFrom(
                                foregroundColor: color.color,
                              ),
                            );
                          }).toList(),
                    ),
                    // 提交按钮
                    ElevatedButton(
                      child: const Text('提交'),
                      onPressed: () {
                        if (form.valid) {
                          debugPrint(form.value.toString());
                        }
                      },
                    ),
                  ],
                );
              },
            ),
          ),
        ),
      ),
    );
  }
}

// 定义颜色标签枚举
enum ColorLabel {
  blue('蓝色', Colors.blue),
  pink('粉色', Colors.pink),
  green('绿色', Colors.green),
  yellow('橙色', Colors.orange),
  grey('灰色', Colors.grey);

  const ColorLabel(this.label, this.color);
  final String label;
  final Color color;
}

// 定义图标标签枚举(示例)
enum IconLabel {
  smile('微笑', Icons.sentiment_satisfied_outlined),
  cloud('云朵', Icons.cloud_outlined),
  brush('画笔', Icons.brush_outlined),
  heart('爱心', Icons.favorite);

  const IconLabel(this.label, this.icon);
  final String label;
  final IconData icon;
}

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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用reactive_dropdown_menu插件的示例代码。这个插件允许你创建一个交互式的下拉菜单,非常适合在表单中使用。

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

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

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

以下是一个完整的示例代码,展示了如何使用reactive_dropdown_menu

import 'package:flutter/material.dart';
import 'package:reactive_dropdown_menu/reactive_dropdown_menu.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';

void main() {
  runApp(ProviderScope(child: MyApp()));
}

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

class MyHomePage extends HookWidget {
  final List<String> options = ['Option 1', 'Option 2', 'Option 3'];

  @override
  Widget build(BuildContext context) {
    final selectedValue = useState<String?>(null);

    return Scaffold(
      appBar: AppBar(
        title: Text('Reactive Dropdown Menu Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            ReactiveDropdownMenu<String>(
              data: options,
              value: selectedValue.value,
              onChanged: (newValue) => selectedValue.value = newValue,
              searchEnabled: true,
              textField: 'Select an option',
              hint: Text('Please select an option'),
              popupMenuItemBuilder: (context, item) {
                return ReactiveDropdownMenuItem<String>(
                  value: item,
                  child: Text(item),
                );
              },
              elevation: 8,
              style: TextStyle(fontSize: 18),
              searchStyle: TextStyle(fontSize: 16),
              popupStyle: TextStyle(fontSize: 16),
              icon: Icon(Icons.arrow_drop_down),
              iconDisabledColor: Colors.grey,
              iconEnabledColor: Colors.blue,
              borderRadius: BorderRadius.circular(8),
              formFieldStyle: InputDecoration(
                border: OutlineInputBorder(
                  borderRadius: BorderRadius.circular(8),
                ),
                filled: true,
                fillColor: Colors.white.withOpacity(0.9),
              ),
            ),
            SizedBox(height: 20),
            Text('Selected Value: ${selectedValue.value ?? 'None'}'),
          ],
        ),
      ),
    );
  }
}

代码解释:

  1. 依赖管理:确保在pubspec.yaml文件中添加了reactive_dropdown_menu依赖。
  2. 应用入口MyApp是应用的根组件,使用MaterialApp作为顶层组件。
  3. 主页面MyHomePage是一个HookWidget,利用Flutter Hooks管理状态。
  4. 状态管理:使用useState钩子来管理下拉菜单的选中值。
  5. ReactiveDropdownMenu
    • data:下拉菜单的选项列表。
    • value:当前选中的值。
    • onChanged:当选中值改变时的回调函数。
    • searchEnabled:启用搜索功能。
    • textField:输入框的占位符文本。
    • hint:当没有选中值时显示的提示文本。
    • popupMenuItemBuilder:构建下拉菜单项的回调。
    • 其他参数用于自定义下拉菜单的样式和图标。

这个示例展示了如何使用reactive_dropdown_menu插件创建一个具有搜索功能的交互式下拉菜单,并实时显示选中的值。你可以根据需要进一步自定义和扩展这个示例。

回到顶部