Flutter增强型下拉菜单插件enhanced_drop_down的使用
Flutter增强型下拉菜单插件enhanced_drop_down的使用
一个完全可定制的下拉组件,它将标签和下拉组件组合成一个组件。
使用
要使用此包,请将其作为依赖项添加到你的pubspec.yaml
文件中:
dependencies:
enhanced_drop_down: ^版本号
然后运行flutter pub get
来获取依赖。
API
增强型下拉组件(或简称EDW),基于Flutter的下拉组件,但通过以下方式增强了功能:
- 下拉组件附带一个标签,帮助用户了解下拉选项。
- 可以从数据源获取下拉选项。
- 可以设置默认值作为未选择时的可见选项。
- 需要回调函数来获取用户的选项。
- 如果你依赖外部数据源提供下拉选项的数据,可以传递URL来获取该数据。
- 数据可以是一个包含多个字段的对象。
- 或者是一组对象。
实例化EDW
实例化EDW可以通过两种方式进行:
方式一:数据源为端点(Uri类型)
EnhancedDropDown.withEndpoint(
dropdownLabelTitle: "我的事物",
defaultOptionText: "请选择",
urlToFetchData: Uri.https("run.mocky.io","/v3/babc0845-8163-4f1e-80df-9bcabd3d4c43"),
valueReturned: (chosen) {
print(chosen);
}
)
方式二:数据源为列表(String类型)
EnhancedDropDown.withData(
dropdownLabelTitle: "我的事物",
dataSource: ["A", "B"],
defaultOptionText: "请选择",
valueReturned: (chosen) {
print(chosen);
}
)
使用自定义对象作为数据源
如果你想要使用自定义对象作为EDW的数据源,必须:
- 在类内部实现
toJson
和fromJson
方法(参考person.dart
)。 - 否则,解析数据时会抛出异常:
E/flutter (14555): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: Exception: EnhancedDropDownWidget did you remember to implement toJson on your custom object?
- 传递一个字符串形式的字段名来在下拉框中展示(使用
fieldToPresent
)。
EnhancedDropDown.withData(
dropdownLabelTitle: "EDW With Data Object",
dataSource: [
new Person("First", "Last", 10),
new Person("Last", "First", 20)
],
defaultOptionText: "请选择人物",
valueReturned: (chosen) {
print(chosen);
},
fieldToPresent: "firstName"
)
你可以查看Person
的实现(在示例项目中和下方):
class Person {
String firstName;
String lastName;
int age;
Person(String _firstName, String _lastName, int _age) {
firstName = _firstName;
lastName = _lastName;
age = _age;
}
Person.fromJson(Map<String, dynamic> json) {
firstName = json["firstName"];
lastName = json["lastName"];
age = json["age"];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data["firstName"] = firstName;
data["lastName"] = lastName;
data["age"] = age;
return data;
}
}
截图
示例代码
import 'package:flutter/material.dart';
import 'package:enhanced_drop_down/enhanced_drop_down.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(key: UniqueKey(), title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({required Key key, required this.title}) : super(key: key);
final String title;
[@override](/user/override)
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
String _selected = "";
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('请求位置权限'),
),
body: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Center(
child: new EnhancedDropDown.withData(
dropdownLabelTitle: "标签",
defaultOptionText: "选择一个",
dataSource: ["选项A", "选项B"],
valueReturned: (chosen) {
_selected = chosen;
print(_selected);
},
),
)
]));
}
}
更多关于Flutter增强型下拉菜单插件enhanced_drop_down的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter增强型下拉菜单插件enhanced_drop_down的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter项目中使用enhanced_drop_down
插件的示例代码。enhanced_drop_down
是一个功能强大的Flutter下拉菜单插件,它提供了丰富的自定义选项和增强功能。
首先,确保你已经在pubspec.yaml
文件中添加了enhanced_drop_down
依赖:
dependencies:
flutter:
sdk: flutter
enhanced_drop_down: ^x.y.z # 替换为最新版本号
然后运行flutter pub get
来安装依赖。
以下是一个完整的示例代码,展示如何使用enhanced_drop_down
创建一个增强型下拉菜单:
import 'package:flutter/material.dart';
import 'package:enhanced_drop_down/enhanced_drop_down.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Enhanced Drop Down Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
String? selectedValue;
final List<DropDownMenuItem> items = [
DropDownMenuItem(value: 'item1', child: Text('Item 1')),
DropDownMenuItem(value: 'item2', child: Text('Item 2')),
DropDownMenuItem(value: 'item3', child: Text('Item 3')),
];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Enhanced Drop Down Demo'),
),
body: Center(
child: EnhancedDropDown(
value: selectedValue,
hint: Text('Select an item'),
searchHint: Text('Search...'),
data: items,
itemComparator: (itemA, itemB) => itemA.value.compareTo(itemB.value),
onChanged: (value) {
setState(() {
selectedValue = value;
});
},
isSearchable: true,
searchFn: (String query, List<DropDownMenuItem> items) {
List<DropDownMenuItem> result = [];
result.addAll(items.where((item) {
String label = item.child is Text ? (item.child as Text).data : '';
return label.toLowerCase().contains(query.toLowerCase());
}).toList());
return result;
},
clearable: true,
dropdownDecoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
color: Colors.white,
border: Border.all(color: Colors.grey[400]!),
),
dropdownSearchDecoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
color: Colors.white,
border: Border.all(color: Colors.grey[400]!),
),
dialogBoxDecoration: BoxDecoration(
shape: BoxShape.rectangle,
color: Colors.white,
borderRadius: BorderRadius.circular(10),
boxShadow: [
BoxShadow(
color: Colors.grey.withOpacity(0.5),
spreadRadius: 5,
blurRadius: 7,
offset: Offset(0, 3), // changes position of shadow
),
],
),
searchFieldDecoration: InputDecoration(
prefixIcon: Icon(Icons.search),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(10),
),
contentPadding: EdgeInsets.all(10),
hintText: 'Search...',
),
),
),
);
}
}
在这个示例中:
- 我们创建了一个包含三个菜单项的列表
items
。 - 使用
EnhancedDropDown
小部件来创建下拉菜单。 value
属性保存当前选中的值。hint
属性显示在未选择任何项时的占位符文本。searchHint
属性显示在搜索框中的提示文本。data
属性包含下拉菜单项的数据。itemComparator
属性用于比较两个菜单项的值。onChanged
回调函数在选中项改变时被调用。isSearchable
属性允许菜单项可搜索。searchFn
函数用于根据用户输入筛选菜单项。clearable
属性允许清除已选中的项。dropdownDecoration
、dropdownSearchDecoration
、dialogBoxDecoration
和searchFieldDecoration
属性用于自定义下拉菜单的外观。
这个示例展示了如何使用enhanced_drop_down
插件创建一个功能丰富的下拉菜单,包括搜索功能和自定义样式。