Flutter表单字段下拉选择插件form_field_drop_down的使用
Flutter表单字段下拉选择插件 form_field_drop_down
的使用
form_field_drop_down
是一个高度可定制的Flutter下拉菜单插件,支持诸如搜索、API集成、自定义UI和验证等强大功能。
特性
- 显示静态项或通过API动态获取数据。
- 使用BoxDecoration和自定义项构建器完全自定义下拉外观。
- 支持只读和可搜索下拉菜单,并提供其他自定义选项。
- 与TextFormField轻松集成以实现验证和装饰。
- 增强用户界面的高级光标样式。
- 无缝集成添加按钮以实现自定义功能。
- 灵活的搜索和过滤选项,支持本地和基于API的数据。
安装
- 在
pubspec.yaml
中添加最新版本的包(并运行flutter pub get
):
dependencies:
form_filed_drop_down: latest_version
- 导入包并在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项目中按照以下步骤实现下拉选择字段:
- 导入必要的包。
- 创建一个包含选项的列表。
- 使用
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
插件来创建一个带有验证功能的下拉选择字段,并处理用户的选择和表单提交。你可以根据自己的需求进一步自定义和扩展这个示例。