Flutter表单字段下拉选择插件form_field_drop_down的使用

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

Flutter表单字段下拉选择插件 form_field_drop_down 的使用

form_field_drop_down 是一个高度可定制的Flutter下拉菜单插件,支持诸如搜索、API集成、自定义UI和验证等强大功能。

特性

  • 显示静态项或通过API动态获取数据。
  • 使用BoxDecoration和自定义项构建器完全自定义下拉外观。
  • 支持只读和可搜索下拉菜单,并提供其他自定义选项。
  • 与TextFormField轻松集成以实现验证和装饰。
  • 增强用户界面的高级光标样式。
  • 无缝集成添加按钮以实现自定义功能。
  • 灵活的搜索和过滤选项,支持本地和基于API的数据。

安装

  1. pubspec.yaml中添加最新版本的包(并运行flutter pub get):
dependencies:
  form_filed_drop_down: latest_version
  1. 导入包并在Flutter应用中使用它:
import 'package:form_filed_drop_down/form_filed_drop_down.dart';

示例用法

1. 基本的 FormFiledDropDown

import 'package:flutter/material.dart';
import 'package:from_filed_drop_down/form_filed_drop_down.dart';

final itemController = OverlayPortalController();
final itemTextController = TextEditingController();

String? selectedItem;
List<String> itemList = ["item", "item 2", "item 3", "item 4", "item 5", "item 6"];

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: FormFiledDropDown<String>(
        controller: itemController,
        item: itemList,
        textStyle: const TextStyle(fontSize: 12, fontWeight: FontWeight.w400),
        filedDecoration: const InputDecoration(),
        onChanged: (String? value) {},
        listItemBuilder: (context, item, isSelected) {
          return Text(
            item,
            style: TextStyle(
              fontSize: 12,
              color: isSelected ? Colors.white : Colors.black,
              fontWeight: FontWeight.w400,
            ),
          );
        },
      ),
    );
  }
}

2. 包含自定义添加按钮的 FormFiledDropDown

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: [
          FormFiledDropDown<String>(
            item: itemList,
            controller: itemController,
            canShowButton: true,
            addButton: InkWell(
              onTap: () {
                // 添加你的事件
              },
              child: Container(
                height: 40,
                padding: const EdgeInsets.all(10),
                decoration: BoxDecoration(
                  color: Colors.green,
                  borderRadius: BorderRadius.circular(2),
                ),
                child: const Row(
                  children: [
                    Expanded(
                      child: Text(
                        "Add",
                        maxLines: 1,
                        textAlign: TextAlign.start,
                        overflow: TextOverflow.ellipsis,
                        style: TextStyle(color: Colors.white),
                      ),
                    ),
                    Icon(Icons.add, color: Colors.white)
                  ],
                ),
              ),
            ),
            textStyle: const TextStyle(fontSize: 12, fontWeight: FontWeight.w400),
            menuDecoration: BoxDecoration(
              color: Colors.white,
              borderRadius: BorderRadius.circular(4),
              border: Border.all(color: Colors.blueAccent),
            ),
            filedDecoration: const InputDecoration(),
            onChanged: (String? value) {},
            listItemBuilder: (context, item, isSelected) {
              return Text(
                item,
                style: TextStyle(
                  fontSize: 12,
                  color: isSelected ? Colors.white : Colors.black,
                  fontWeight: FontWeight.w400,
                ),
              );
            },
          ),
        ],
      ),
    );
  }
}

3. 自定义类型模型的下拉菜单

假设我们有一个自定义类型的对象:

class ItemModel {
  final int id;
  final String name;

  ItemModel({required this.id, required this.name});

  factory ItemModel.fromJson(Map<String, dynamic> json) => ItemModel(
        id: json["id"],
        name: json["name"],
      );

  @override
  bool operator ==(Object other) =>
      identical(this, other) ||
      other is ItemModel &&
          runtimeType == other.runtimeType &&
          id == other.id;

  @override
  int get hashCode => id.hashCode;

  Map<String, dynamic> toJson() => {"id": id, "name": name};
}

4. 动态搜索或API集成的 FormFiledDropDown

这是一个从API动态获取下拉项的高级示例:

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: [
          FormFiledDropDown<String>(
            controller: itemController,
            initialItem: selectedItem,
            item: itemList,
            onTap: () async {
              // 示例API,或者返回你的API列表
              return itemList;
            },
            textStyle: const TextStyle(fontSize: 12, fontWeight: FontWeight.w400),
            filedDecoration: const InputDecoration(),
            onChanged: (String? value) {},
            onSearch: (value) async {
              // 我们可以调用API进行搜索,也可以在静态列表中实现本地搜索
              return itemList.where((element) {
                return element.toLowerCase().contains(value.toLowerCase());
              }).toList();
            },
            listItemBuilder: (context, item, isSelected) {
              return Text(
                item,
                style: TextStyle(
                  fontSize: 12,
                  color: isSelected ? Colors.white : Colors.black,
                  fontWeight: FontWeight.w400,
                ),
              );
            },
          ),
        ],
      ),
    );
  }
}

属性

属性 类型 描述
item List<T>? 要显示的下拉项列表。
filedReadOnly bool 设置 TextFormField 是否只读。
readOnly bool 设置下拉菜单是否只读。
initialItem T? 下拉菜单的初始值。
isApiLoading bool 指示API是否正在加载。
dropdownOffset bool 更改下拉菜单打开的偏移量。
showCursor bool? 切换光标的可见性。
cursorColor Color? 更改光标颜色。
cursorHeight double? 设置光标高度。
cursorWidth double? 设置光标宽度。
errorWidgetHeight double? 设置错误小部件的高度。
cursorRadius Radius? 设置光标边框半径。
cursorErrorColor Color? 设置光标错误颜色。
textStyle TextStyle 样式化搜索或选定文本。
loaderWidget Widget? API加载时显示的自定义小部件。
focusNode FocusNode? 可搜索下拉菜单的焦点管理。
errorMessage Text? 当未找到项目时显示的自定义错误消息。
overlayHeight double? 下拉菜单叠加层的高度。
addButton Widget? 添加一个自定义按钮以实现额外功能。
onChanged Function(T? value) 当选择一个项时触发的回调。
menuDecoration BoxDecoration? 自定义下拉菜单的装饰。
filedDecoration InputDecoration TextFormField 的装饰。
onTap Future<List<T>> Function() 加载下拉菜单项的动态方法。
autovalidateMode AutovalidateMode? 启用更改时的验证监听器。
controller OverlayPortalController 控制下拉菜单可见性的控制器。
listItemBuilder ListItemBuilder<T> 下拉项的自定义构建器。
selectedItemBuilder SelectedItemBuilder<T?>? 已选项目的自定义构建器。
onSearch Future<List<T>> Function(String) API搜索功能的回调。
listPadding EdgeInsets? 设置列表视图的填充。
menuMargin EdgeInsets? 设置下拉项容器的边距。
canShowButton bool 切换添加按钮的可见性。
textAlign TextAlign 对齐搜索字段中的文本。
keyboardType TextInputType? 设置 TextFormField 的输入类型。
maxLine int? 限制文本的最大行数。
maxLength int? 限制字符的最大数量。
inputFormatters List<TextInputFormatter>? 应用于 TextFormField 的输入格式规则。
validator String? Function(String?) 验证下拉值。

以上是关于form_field_drop_down插件的基本介绍及其使用示例。你可以根据自己的需求调整属性来满足特定的功能需求。


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

1 回复

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


当然,以下是一个关于如何在Flutter中使用form_field_drop_down插件来创建带有下拉选择字段的表单的示例代码。form_field_drop_down插件允许你创建一个带有样式和验证功能的下拉选择字段。

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

dependencies:
  flutter:
    sdk: flutter
  form_field_validation: ^0.3.0  # 确保版本号是最新的,这里只是一个示例版本
  form_field_drop_down: ^4.0.0  # 确保版本号是最新的,这里只是一个示例版本

然后,你可以在你的Flutter项目中按照以下步骤实现下拉选择字段:

  1. 导入必要的包。
  2. 创建一个包含选项的列表。
  3. 使用FormFieldDropDown小部件来创建下拉选择字段。

以下是完整的示例代码:

import 'package:flutter/material.dart';
import 'package:form_field_validation/form_field_validation.dart';
import 'package:form_field_drop_down/form_field_drop_down.dart';

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  // 下拉选项列表
  final List<String> options = ['Option 1', 'Option 2', 'Option 3'];
  // 当前选中的值
  String? selectedValue;

  // 提交表单处理函数
  void handleSubmit() {
    // 在这里处理表单提交逻辑
    print('Selected value: $selectedValue');
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Form Field Drop Down Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            FormFieldDropDown<String>(
              label: 'Select an option',
              validator: (value) {
                if (value == null || value.isEmpty) {
                  return 'Please select an option';
                }
                return null;
              },
              options: options.map((option) {
                return DropdownMenuItem<String>(
                  value: option,
                  child: Text(option),
                );
              }).toList(),
              initialValue: selectedValue,
              onChanged: (newValue) {
                setState(() {
                  selectedValue = newValue;
                });
              },
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                if (_validateForm()) {
                  handleSubmit();
                }
              },
              child: Text('Submit'),
            ),
          ],
        ),
      ),
    );
  }

  // 验证表单
  bool _validateForm() {
    final form = GlobalKey<FormFieldState>().currentState;
    if (form!.validate()) {
      form.save();
      return true;
    }
    return false;
  }
}

注意:

  • 在这个示例中,FormFieldDropDown 并没有直接使用 GlobalKey<FormFieldState>(),因为FormFieldDropDown本身会处理其内部状态。不过,为了展示表单验证的概念,我在 _validateForm 方法中模拟了验证过程。实际上,FormFieldDropDown 提供了自己的验证机制,你可以通过 validator 参数来定义验证规则。
  • DropdownMenuItem 用于定义下拉列表中的每个选项。
  • initialValue 用于设置下拉字段的初始值。
  • onChanged 回调函数用于处理用户选择的变化。

这个示例代码展示了如何使用form_field_drop_down插件来创建一个带有验证功能的下拉选择字段,并处理用户的选择和表单提交。你可以根据自己的需求进一步自定义和扩展这个示例。

回到顶部