Flutter增强型下拉菜单插件enhanced_drop_down的使用

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

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的数据源,必须:

  • 在类内部实现toJsonfromJson方法(参考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;
  }
}

截图

截图1 截图2 截图3 截图4 截图5

示例代码

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

1 回复

更多关于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...',
          ),
        ),
      ),
    );
  }
}

在这个示例中:

  1. 我们创建了一个包含三个菜单项的列表items
  2. 使用EnhancedDropDown小部件来创建下拉菜单。
  3. value属性保存当前选中的值。
  4. hint属性显示在未选择任何项时的占位符文本。
  5. searchHint属性显示在搜索框中的提示文本。
  6. data属性包含下拉菜单项的数据。
  7. itemComparator属性用于比较两个菜单项的值。
  8. onChanged回调函数在选中项改变时被调用。
  9. isSearchable属性允许菜单项可搜索。
  10. searchFn函数用于根据用户输入筛选菜单项。
  11. clearable属性允许清除已选中的项。
  12. dropdownDecorationdropdownSearchDecorationdialogBoxDecorationsearchFieldDecoration属性用于自定义下拉菜单的外观。

这个示例展示了如何使用enhanced_drop_down插件创建一个功能丰富的下拉菜单,包括搜索功能和自定义样式。

回到顶部