Flutter芯片输入插件advanced_chips_input的使用

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

Flutter芯片输入插件advanced_chips_input的使用

简介

flutter_advanced_chips_input 是一个Flutter包,它提供了一个可定制的文本输入小部件,可以从文本创建芯片(chips)。它支持芯片删除、输入验证以及多种定制选项,如容器装饰、芯片文本样式和删除图标。无论您是想创建标签列表、提及列表还是其他任何项目列表,这个包都能帮助您创建美观且功能强大的芯片输入字段。

GIF演示 GIF演示

特性

  • 从文本输入创建芯片。
  • 使用可自定义的删除图标删除芯片。
  • 在创建芯片之前验证输入。
  • 定制芯片容器装饰、文本样式和边距。
  • 支持通过退格键删除芯片。

使用方法

导入包

import 'package:flutter_advanced_chips_input/flutter_advanced_chips_input.dart';

包含 AdvancedChipsInput 小部件

AdvancedChipsInput(
  separatorCharacter: ' ',
  placeChipsSectionAbove: true,
  widgetContainerDecoration: BoxDecoration(
    border: Border.all(color: Colors.grey),
  ),
  chipContainerDecoration: BoxDecoration(
    color: Colors.blue,
    borderRadius: BorderRadius.all(Radius.circular(50)),
  ),
  chipTextStyle: TextStyle(color: Colors.white),
  validateInput: true,
  validateInputMethod: (value) {
    if (value.length < 3) {
      return '输入应至少为3个字符长';
    }
    return null;
  },
  onChipDeleted: (chipText, index) {
    print('已删除芯片: $chipText 在索引 $index');
  },
),

自定义选项

AdvancedChipsInput 支持多种自定义选项:

  • separatorCharacter: 用于分隔输出的字符。例如,’ ’ 将以空格分隔输出。
  • placeChipsSectionAbove: 是否将芯片部分放置在文本字段上方或下方。
  • widgetContainerDecoration: 主小部件容器的装饰。
  • marginBetweenChips: 芯片之间的边距。
  • paddingInsideChipContainer: 芯片容器内的填充。
  • paddingInsideWidgetContainer: 主小部件容器内的填充。
  • chipContainerDecoration: 芯片容器的装饰。
  • chipTextStyle: 芯片的文本样式。
  • deleteIcon: 删除图标的样式。
  • validateInput: 是否在添加到芯片之前验证输入。
  • validateInputMethod: 验证方法。
  • eraseKeyLabel: 用于擦除芯片的键标签,默认为 ‘Backspace’。
  • autoFocus: 是否自动聚焦小部件。
  • textFormFieldStyle: 文本字段的样式。
  • onChanged: 当文本字段内容更改时的回调。
  • onEditingComplete: 编辑完成时的回调。
  • onSubmitted: 提交文本字段时的回调。
  • onSaved: 保存文本字段时的回调。
  • onChipDeleted: 删除芯片时的回调,返回被删除的芯片内容和索引。

示例代码

以下是一个完整的简单Flutter应用程序示例,展示了如何使用 flutter_advanced_chips_input

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Advanced Chips Input Example'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: AdvancedChipsInput(
            separatorCharacter: ' ',
            placeChipsSectionAbove: true,
            widgetContainerDecoration: BoxDecoration(
              border: Border.all(color: Colors.grey),
            ),
            chipContainerDecoration: BoxDecoration(
              color: Colors.blue,
              borderRadius: BorderRadius.all(Radius.circular(50)),
            ),
            chipTextStyle: TextStyle(color: Colors.white),
            validateInput: true,
            validateInputMethod: (value) {
              if (value.length < 3) {
                return '输入应至少为3个字符长';
              }
              return null;
            },
            onChipDeleted: (chipText, index) {
              print('已删除芯片: $chipText 在索引 $index');
            },
          ),
        ),
      ),
    );
  }
}

许可证

本项目遵循MIT许可证 - 详情请参阅 LICENSE 文件。


希望这个帖子能帮助您更好地理解和使用 flutter_advanced_chips_input 插件!如果您有任何问题或需要进一步的帮助,请随时提问。


更多关于Flutter芯片输入插件advanced_chips_input的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter芯片输入插件advanced_chips_input的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter中使用advanced_chips_input插件的代码示例。这个插件允许你创建一个芯片输入字段,用户可以在其中添加、删除或选择芯片。

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

dependencies:
  flutter:
    sdk: flutter
  advanced_chips_input: ^^最新版本号  # 请替换为实际最新版本号

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

接下来,在你的Dart文件中,你可以按照以下方式使用AdvancedChipsInput

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

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  final TextEditingController _controller = TextEditingController();
  List<String> _chips = [];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Advanced Chips Input Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            AdvancedChipsInput<String>(
              value: _chips,
              onChanged: (chips) {
                setState(() {
                  _chips = chips;
                });
              },
              chipBuilder: (context, state, chip) {
                return Chip(
                  label: Text(chip),
                  deleteIcon: Icon(Icons.cancel),
                  onDelete: () => state.removeChip(chip),
                );
              },
              inputDecoration: InputDecoration(
                labelText: 'Enter chip text',
                border: OutlineInputBorder(),
              ),
              keyboardAppearance: Brightness.light,
              findSuggestions: (String query) async {
                // 模拟从服务器获取建议
                return query.length > 1
                    ? List.generate(10, (i) => '$query$i')
                    : [];
              },
              suggestionBuilder: (context, state, suggestion) {
                return ListTile(
                  leading: Icon(Icons.label),
                  title: Text(suggestion),
                  onTap: () => state.addChip(suggestion),
                );
              },
            ),
            SizedBox(height: 16),
            Text('Selected chips: $_chips'),
          ],
        ),
      ),
    );
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }
}

代码解释

  1. 依赖导入:首先,确保你已经导入了advanced_chips_input包。

  2. 状态管理:在_MyHomePageState中,我们使用了TextEditingController来管理输入,以及一个List<String>来存储选中的芯片。

  3. AdvancedChipsInput

    • value:当前选中的芯片列表。
    • onChanged:当芯片列表发生变化时的回调。
    • chipBuilder:自定义芯片的外观和行为。
    • inputDecoration:输入框的装饰。
    • keyboardAppearance:键盘的外观。
    • findSuggestions:根据用户输入提供建议的异步函数。
    • suggestionBuilder:自定义建议项的外观和行为。
  4. UI展示:在UI中,AdvancedChipsInput用于输入和选择芯片,下方有一个Text控件来显示当前选中的芯片列表。

  5. 资源释放:在dispose方法中释放TextEditingController资源。

这个示例展示了如何使用advanced_chips_input插件来创建一个具有自动完成功能的芯片输入字段。你可以根据需要进一步自定义和扩展这个示例。

回到顶部