搜索插件、代码仓与 APP 分类

插件详情v1.2.0

combos

Flutter 的组合小部件。包含 Combo、AwaitCombo、ListCombo、SelectorCombo、TypeaheadCombo、MenuItemCombo

近 30 天下载
58
喜欢数
21
Pub 分数
40

安装插件

flutter pub add combos

插件介绍

基于插件公开信息、社区数据与项目使用情况整理的选型参考。

Combos 是一个 Flutter 包,提供了一系列专门的组合小部件,旨在简化常见的 UI 模式,特别是下拉和选择交互。它包含 Combo、AwaitCombo、ListCombo、SelectorCombo、TypeaheadCombo 和 MenuItemCombo 等小部件,每个都针对特定用例进行了优化,例如异步数据加载、列表渲染以及自动补全搜索功能。这些组件通过提供可重复使用、一致且可自定义的解决方案,提升了开发者在 Flutter 应用中的表单输入和导航菜单方面的开发效率。

适合场景

  • 具有动态选项的表单输入
  • 自动完成搜索字段
  • 下拉框中的异步数据加载
  • 可自定义的菜单项渲染
  • 基于列表的选择界面
  • 动态表单字段依赖

主要特点

  • 预构建的组合小部件,用于常见模式
  • 通过 AwaitCombo 支持异步数据
  • 带过滤功能的自动补全输入
  • 灵活的列表和选择器集成
  • 可重复使用且可组合的设计
  • 跨小部件的干净、一致的 API

适合对象

  • 开发具有复杂下拉菜单的表单的开发者
  • 需要可重用选择组件的团队
  • 需要可搜索或动态列表的应用程序
  • 专注于用户体验一致性的Flutter项目
  • 希望减少组合样板代码的开发者

使用建议

  • 有限的平台特定自定义
  • 无内置主题支持
  • 需要理解 Flutter widget 组合
  • 可能会略微增加包大小
  • 未针对无分页的大数据集进行优化

原始 README

以下为关联源码仓库的 README 原文快照,最新内容请访问源码仓库。

Combos

About

Combo widgets for Flutter.

Install instructions

Docs

Online Samples

alt text

Includes:

  • Combo - Simple combo widget for custom child and popup content.
  • AwaitCombo - Combo widget with delayed popup content builder for loading data with the progress indication
  • ListCombo - Combo widget for displaying items list
  • SelectorCombo - Combo widget for displaying items list with selected value
  • TypeaheadCombo - Typeahead widget with the text input and custom 'search' method
  • MenuItemCombo - Menu item widget for displaying popup menus
Examples
  • Combo
Combo(
  child: const Padding(
    padding: EdgeInsets.all(16),
    child: Text('Combo child'),
  ),
  popupBuilder: (context, mirrored) => const Material(
    elevation: 4,
    child: Padding(
      padding:
          EdgeInsets.symmetric(vertical: 48, horizontal: 16),
      child: Center(child: Text('Combo popup')),
    ),
  ),
)
  • AwaitCombo
AwaitCombo(
  child: const Padding(
    padding: EdgeInsets.all(16),
    child: Text('Combo child'),
  ),
  popupBuilder: (context) async {
    await Future.delayed(const Duration(milliseconds: 500));
    return const Material(
      elevation: 4,
      child: Padding(
        padding:
            EdgeInsets.symmetric(vertical: 48, horizontal: 16),
        child: Center(child: Text('Combo popup')),
      ),
    );
  },
)
  • ListCombo
ListCombo<String>(
  child: const Padding(
    padding: EdgeInsets.all(16),
    child: Text('Combo child'),
  ),
  getList: () async {
    await Future.delayed(const Duration(milliseconds: 500));
    return ['Item1', 'Item2', 'Item3'];
  },
  itemBuilder: (context, parameters, item) => ListTile(title: Text(item)),
  onItemTapped: (item) {},
)
  • SelectorCombo
String _item;

...

SizedBox(
  width: 200,
  child: SelectorCombo<String>(
    selected: _item,
    getList: () async {
      await Future.delayed(const Duration(milliseconds: 500));
      return ['Item1', 'Item2', 'Item3'];
    },
    itemBuilder: (context, parameters, item) =>
        ListTile(title: Text(item ?? '<Empty>')),
    onItemTapped: (item) => setState(() => _item = item),
  ),
)
  • TypeaheadCombo
String _item;

...

SizedBox(
  width: 200,
  child: TypeaheadCombo<String>(
    selected: _item,
    getList: (text) async {
      await Future.delayed(const Duration(milliseconds: 500));
      return ['Item1', 'Item2', 'Item3'];
    },
    itemBuilder: (context, parameters, item) =>
        ListTile(title: Text(item ?? '<Empty>')),
    onItemTapped: (item) => setState(() => _item = item),
    getItemText: (item) => item,
    decoration: const InputDecoration(labelText: 'Typeahead'),
  ),
)
  • MenuItemCombo
MenuItemCombo<String>(
  item: MenuItem(
      'File',
      () => [
            MenuItem('New'),
            MenuItem.separator,
            MenuItem('Open'),
            MenuItem('Save'),
            MenuItem('Save As...'),
            MenuItem.separator,
            MenuItem(
                'Recent',
                () => [
                      MenuItem('Folders', () async {
                        await Future.delayed(
                            Duration(milliseconds: 500));
                        return [
                          MenuItem('Folder 1'),
                          MenuItem('Folder 2'),
                          MenuItem('Folder 3'),
                        ];
                      }),
                      MenuItem('Files', () async {
                        await Future.delayed(
                            Duration(milliseconds: 500));
                        return [
                          MenuItem('File 1'),
                          MenuItem('File 2'),
                          MenuItem('File 3'),
                        ];
                      }),
                    ]),
            MenuItem.separator,
            MenuItem('Exit'),
          ]),
  itemBuilder: (context, parameters, item) => Padding(
    padding: const EdgeInsets.all(16),
    child: Text(item.item),
  ),
  onItemTapped: (value) {
    final dialog =
        AlertDialog(content: Text('${value.item} tapped!'));
    showDialog(context: context, builder: (_) => dialog);
  },
)

所属分类

源码仓库

使用此插件的项目

暂无相关数据。