Flutter异步搜索下拉插件async_searchable_dropdown的使用

Flutter 异步搜索下拉插件 async_searchable_dropdown 的使用

关于

此 Flutter 包帮助创建一个下拉菜单,其项目在搜索时被获取。

特性

  • 高度可定制。
  • 在开始时和更改搜索文本时获取项目。
  • 内置搜索防抖功能。

演示

演示

开始使用

要使用此包,在你的 pubspec.yaml 文件中添加 async_searchable_dropdown 作为依赖项,并在文件中添加以下导入语句:

import 'package:async_searchable_dropdown/async_searchable_dropdown.dart';

使用示例

以下是一个完整的示例,展示了如何使用 async_searchable_dropdown 插件:

import 'dart:math';

import 'package:flutter/material.dart';
import 'package:async_searchable_dropdown/async_searchable_dropdown.dart';

final data = [
  "hello",
  "xyzw",
  "bilal",
  "Romio",
  "Cats in the rain",
  "Ali",
];

// 模拟异步数据获取函数
Future<List<String>> getData(String? search) async {
  // 模拟网络延迟
  await Future.delayed(const Duration(seconds: 2));
  
  // 随机抛出异常以模拟错误情况
  if (Random().nextBool()) throw 'sdd';
  
  // 过滤并返回包含搜索关键词的数据
  return data.where((e) => e.contains(search ?? '')).toList();
}

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  MyApp({Key? key}) : super(key: key);

  // 用于存储选中的值
  final ValueNotifier<String?> selectedValue = ValueNotifier<String?>(null);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Async Searchable Dropdown Example'),
        ),
        body: Column(
          children: [
            const SizedBox(height: 20),
            ValueListenableBuilder<String?>(
              valueListenable: selectedValue,
              builder: (context, value, child) {
                return SearchableDropdown<String>(
                  value: value,
                  itemLabelFormatter: (value) {
                    return value;
                  },
                  remoteItems: getData,
                  onChanged: (value) {
                    selectedValue.value = value;
                    debugPrint('$value');
                  },
                  inputDecoration: const InputDecoration(
                    border: OutlineInputBorder(),
                    labelText: 'List of items',
                    prefixIcon: Icon(Icons.search),
                  ),
                  borderRadius: BorderRadius.circular(10),
                );
              },
            ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter异步搜索下拉插件async_searchable_dropdown的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter异步搜索下拉插件async_searchable_dropdown的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用 async_searchable_dropdown Flutter 插件的示例代码。这个插件允许你在 Flutter 应用中实现异步搜索下拉列表功能。

首先,确保你已经在 pubspec.yaml 文件中添加了 async_searchable_dropdown 依赖:

dependencies:
  flutter:
    sdk: flutter
  async_searchable_dropdown: ^x.y.z  # 替换成最新版本号

然后运行 flutter pub get 来安装依赖。

下面是一个完整的 Flutter 应用示例,展示了如何使用 async_searchable_dropdown

import 'package:flutter/material.dart';
import 'package:async_searchable_dropdown/async_searchable_dropdown.dart';

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  // 模拟异步数据加载
  Future<List<String>> fetchData(String query) async {
    // 模拟延迟
    await Future.delayed(Duration(seconds: 1));

    // 假设我们有一个列表,根据查询过滤结果
    List<String> items = [
      'Apple',
      'Banana',
      'Orange',
      'Pineapple',
      'Grapes',
      'Mango',
      'Strawberry',
      'Blueberry',
      'Watermelon',
      'Peach'
    ];

    return items.where((item) => item.toLowerCase().contains(query.toLowerCase())).toList();
  }

  String? selectedValue;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Async Searchable Dropdown Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            AsyncSearchableDropdown<String>(
              displayClearIcon: true,
              clearIcon: Icon(Icons.clear),
              searchHint: 'Search fruits...',
              label: 'Select a fruit',
              onSearch: fetchData,
              onSelected: (value) {
                setState(() {
                  selectedValue = value;
                });
              },
              onClear: () {
                setState(() {
                  selectedValue = null;
                });
              },
              itemBuilder: (item) {
                return ListTile(
                  leading: Icon(Icons.fruit_dish),
                  title: Text(item),
                );
              },
              noItemsFoundBuilder: () {
                return ListTile(
                  leading: Icon(Icons.error),
                  title: Text('No items found'),
                );
              },
            ),
            SizedBox(height: 20),
            Text('Selected Value: ${selectedValue ?? 'None'}'),
          ],
        ),
      ),
    );
  }
}

代码解释:

  1. 依赖安装:在 pubspec.yaml 文件中添加 async_searchable_dropdown 依赖。

  2. 主应用MyApp 类是应用的入口,它包含一个 MaterialApp,其中定义了应用的主题和主页。

  3. 主页MyHomePage 是一个有状态组件,包含异步搜索下拉列表的逻辑。

  4. 数据加载fetchData 函数模拟了一个异步数据加载过程,它接受一个查询字符串并返回一个过滤后的列表。

  5. 下拉列表AsyncSearchableDropdown 组件用于显示下拉列表。

    • displayClearIcon:显示清除图标。
    • clearIcon:自定义清除图标。
    • searchHint:搜索提示文本。
    • label:下拉列表标签。
    • onSearch:当用户在搜索框中输入文本时调用的函数。
    • onSelected:当用户选择一个项目时调用的函数。
    • onClear:当用户点击清除图标时调用的函数。
    • itemBuilder:自定义每个列表项的构建方式。
    • noItemsFoundBuilder:当没有找到匹配项时显示的组件。
  6. 显示选中的值:在 AsyncSearchableDropdown 下方,有一个 Text 组件显示选中的值。

希望这个示例能帮助你理解如何使用 async_searchable_dropdown 插件。如果有任何问题或需要进一步的帮助,请随时告诉我!

回到顶部