Flutter自动补全功能插件auto_complete_widget_flutter的使用

Flutter自动补全功能插件auto_complete_widget_flutter的使用

auto_complete_widget_flutter

特性

  • AutoCompleteField

示例

以下是一个完整的示例代码,展示如何在Flutter应用中使用auto_complete_widget_flutter插件。

示例代码

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

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: const Center(
        child: Padding(
          padding: EdgeInsets.all(8.0),
          child: Column(
            mainAxisSize: MainAxisSize.min,
            children: [
              Hindi(),
            ],
          ),
        ),
      ),
    );
  }
}

class Hindi extends StatelessWidget {
  const Hindi({
    super.key,
  });

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Row(
      children: [
        Expanded(
          child: AutoCompleteField<String>(
            paddingLeft: 16,
            ctx: context,
            builder: (s, str, selected) => Container(
              color: selected ? Colors.grey.withOpacity(.2) : null,
              padding: const EdgeInsets.symmetric(
                vertical: 4,
                horizontal: 12,
              ),
              child: RichText(
                text: TextSpan(
                  children: s.selected(str).span,
                ),
              ),
            ),
            onSort: (p0, p1) => p1.contains(p0),
            result: (p0) => p0,
            decoration: BoxDecoration(
              color: Colors.grey[200],
            ),
            child: (p0, p1) {
              return TextFormField(
                focusNode: p0,
                controller: p1,
              );
            },
            onResult: (p0) {},
            separatorBuilder: Container(
              height: 1,
              color: Colors.black,
              margin: const EdgeInsets.symmetric(horizontal: 16),
            ),
            values: const [
              'a',
              'b',
              'c',
              'd',
              'dasdkfjahsdfkjashdflkjahsdfjksadhflakjs1',
              'dasdkfjahsdfkjashdflkjahsdfjksadhflakjs2',
              'dasdkfjahsdfkjashdflkjahsdfjksadhflakjs3',
              'dasdkfjahsdfkjashdflkjahsdfjksadhflakjs4',
              'dasdkfjahsdfkjashdflkjahsdfjksadhflakjs5',
              'dasdkfjahsdfkjashdflkjahsdfjksadhflakjs6',
              'dasdkfjahsdfkjashdflkjahsdfjksadhflakjs7',
              'dasdkfjahsdfkjashdflkjahsdfjksadhflakjs8',
              'dasdkfjahsdfkjashdflkjahsdfjksadhflakjs9',
              'dasdkfjahsdfkjashdflkjahsdfjksadhflakjs10',
              'dasdkfjahsdfkjashdflkjahsdfjksadhflakjs11',
              'dasdkfjahsdfkjashdflkjahsdfjksadhflakjs111',
              'dasdkfjahsdfkjashdflkjahsdfjksadhflakjs1111',
              'dasdkfjahsdfkjashdflkjahsdfjksadhflakjs11111',
              'dasdkfjahsdfkjashdflkjahsdfjksadhflakjs111111',
            ],
          ),
        ),
        Expanded(
          child: AutoCompleteField<String>(
            builder: (s, str, selected) => Container(
              color: selected ? Colors.grey.withOpacity(.2) : null,
              padding: const EdgeInsets.symmetric(
                vertical: 4,
                horizontal: 12,
              ),
              child: RichText(
                text: TextSpan(
                  children: s.selected(str).span,
                ),
              ),
            ),
            onSort: (p0, p1) => p1.contains(p0),
            result: (p0) => p0,
            decoration: BoxDecoration(
              color: Colors.grey[200],
            ),
            onResult: (p0) {},
            separatorBuilder: Container(
              height: 1,
              color: Colors.black,
              margin: const EdgeInsets.symmetric(horizontal: 16),
            ),
            values: const [
              'a',
              'b',
              'c',
              'd',
              'dasdkfjahsdfkjashdflkjahsdfjksadhflakjs1',
              'dasdkfjahsdfkjashdflkjahsdfjksadhflakjs2',
              'dasdkfjahsdfkjashdflkjahsdfjksadhflakjs3',
              'dasdkfjahsdfkjashdflkjahsdfjksadhflakjs4',
              'dasdkfjahsdfkjashdflkjahsdfjksadhflakjs5',
              'dasdkfjahsdfkjashdflkjahsdfjksadhflakjs6',
              'dasdkfjahsdfkjashdflkjahsdfjksadhflakjs7',
              'dasdkfjahsdfkjashdflkjahsdfjksadhflakjs8',
              'dasdkfjahsdfkjashdflkjahsdfjksadhflakjs9',
              'dasdkfjahsdfkjashdflkjahsdfjksadhflakjs10',
              'dasdkfjahsdfkjashdflkjahsdfjksadhflakjs11',
              'dasdkfjahsdfkjashdflkjahsdfjksadhflakjs111',
              'dasdkfjahsdfkjashdflkjahsdfjksadhflakjs1111',
              'dasdkfjahsdfkjashdflkjahsdfjksadhflakjs11111',
              'dasdkfjahsdfkjashdflkjahsdfjksadhflakjs111111',
            ],
          ),
        ),
      ],
    );
  }
}

extension BuildContextX on BuildContext {
  Offset get position {
    final RenderBox? renderBox = findRenderObject() as RenderBox?;
    final NavigatorState? state = findAncestorStateOfType<NavigatorState>();
    if (state != null) {
      return renderBox?.localToGlobal(
            Offset.zero,
            ancestor: state.context.findRenderObject(),
          ) ??
          Offset.zero;
    }
    return renderBox?.localToGlobal(Offset.zero) ?? Offset.zero;
  }

  Size get sizeWidget {
    final RenderBox? renderBox = findRenderObject() as RenderBox?;
    return renderBox?.size ?? Size.zero;
  }
}

更多关于Flutter自动补全功能插件auto_complete_widget_flutter的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter自动补全功能插件auto_complete_widget_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


auto_complete_widget_flutter 是一个用于在 Flutter 应用中实现自动补全功能的插件。它可以帮助用户在输入时提供建议列表,从而提高用户体验。以下是使用 auto_complete_widget_flutter 的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 auto_complete_widget_flutter 依赖:

dependencies:
  flutter:
    sdk: flutter
  auto_complete_widget_flutter: ^1.0.0  # 请检查最新版本

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

2. 导入包

在你的 Dart 文件中导入 auto_complete_widget_flutter 包:

import 'package:auto_complete_widget_flutter/auto_complete_widget_flutter.dart';

3. 使用 AutoCompleteWidget

AutoCompleteWidget 是一个可自定义的自动补全小部件。你可以通过提供建议列表和回调函数来使用它。

class MyAutoCompletePage extends StatelessWidget {
  // 示例数据
  final List<String> suggestions = [
    'Apple',
    'Banana',
    'Cherry',
    'Date',
    'Fig',
    'Grape',
    'Kiwi',
    'Lemon',
    'Mango',
    'Orange',
    'Peach',
    'Pear',
    'Pineapple',
    'Plum',
    'Raspberry',
    'Strawberry',
    'Watermelon',
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('AutoComplete Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: AutoCompleteWidget<String>(
          suggestions: suggestions,
          itemBuilder: (context, suggestion) {
            return ListTile(
              title: Text(suggestion),
            );
          },
          onSelected: (suggestion) {
            print('Selected: $suggestion');
          },
          textFieldBuilder: (context, controller, focusNode) {
            return TextField(
              controller: controller,
              focusNode: focusNode,
              decoration: InputDecoration(
                labelText: 'Search',
                border: OutlineInputBorder(),
              ),
            );
          },
        ),
      ),
    );
  }
}

4. 自定义 AutoCompleteWidget

AutoCompleteWidget 提供了一些可自定义的参数:

  • suggestions: 提供建议列表。
  • itemBuilder: 自定义建议项的显示方式。
  • onSelected: 当用户选择一个建议项时触发的回调。
  • textFieldBuilder: 自定义输入框的显示方式。

5. 运行应用

现在你可以运行你的 Flutter 应用,并体验自动补全功能。当你在输入框中输入时,会显示匹配的建议项,并且你可以选择一个建议项。

6. 进一步定制

你可以根据需要进一步定制 AutoCompleteWidget,例如添加过滤逻辑、自定义样式等。

7. 处理异步数据

如果你的建议列表是通过异步获取的(例如从 API 获取),你可以使用 FutureBuilderStreamBuilder 来动态更新建议列表。

AutoCompleteWidget<String>(
  suggestions: _fetchSuggestions(),
  itemBuilder: (context, suggestion) {
    return ListTile(
      title: Text(suggestion),
    );
  },
  onSelected: (suggestion) {
    print('Selected: $suggestion');
  },
  textFieldBuilder: (context, controller, focusNode) {
    return TextField(
      controller: controller,
      focusNode: focusNode,
      decoration: InputDecoration(
        labelText: 'Search',
        border: OutlineInputBorder(),
      ),
    );
  },
)

Future<List<String>> _fetchSuggestions() async {
  // 模拟异步获取数据
  await Future.delayed(Duration(seconds: 1));
  return ['Apple', 'Banana', 'Cherry'];
}
回到顶部