Flutter标签输入插件textfield_tags的使用

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

Flutter标签输入插件textfield_tags的使用

textfield_tags 是一个Flutter插件,允许开发者在文本字段中创建标签。该插件带有两个默认控制器,可以让你存储标签为普通字符串或对象。你也可以通过扩展基类控制器来自定义标签控制器。

环境要求

  • SDK: >=2.12.0 <4.0.0
  • Flutter: >=1.17.0

安装

在项目的pubspec.yaml文件中添加依赖:

dependencies:
  textfield_tags: ^3.0.1

然后执行以下命令安装依赖包:

$ flutter pub get

使用方法

导入包

首先,在你的Dart文件中导入textfield_tags包:

import 'package:textfield_tags/textfield_tags.dart';

创建TextFieldTags Widget

接下来,调用TextFieldTags(...)来创建标签输入框。这个组件接收9个参数:

  • List<String>? initialTags: 初始标签列表。
  • ScrollController? scrollController: 滚动控制器。
  • FocusNode? focusNode: 输入框焦点节点。
  • TextEditingController? textEditingController: 文本编辑控制器。
  • List<String>? textSeparators: 分隔符列表,用于分割标签。
  • LetterCase? letterCase: 标签字母大小写设置。
  • Validator? validator: 验证函数。
  • InputFieldBuilder inputfieldBuilder: 自定义输入框构造器。
  • TextfieldTagsController? textfieldController: 标签控制器。

下面是一些具体的使用示例。

示例代码

字符串标签(StringTagController)

如果你只需要处理基于字符串的标签,那么可以使用StringTagController。下面是一个完整的例子:

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

class MyWidget extends StatelessWidget {
  final _stringTagController = StringTagController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('String Tags Example')),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: TextFieldTags<String>(
          textfieldTagsController: _stringTagController,
          initialTags: ['python', 'java'],
          textSeparators: const [' ', ','],
          validator: (String tag) {
            if (tag == 'php') {
              return 'Php not allowed';
            }
            return null;
          },
          inputFieldBuilder: (context, inputFieldValues) {
            return TextField(
              controller: inputFieldValues.textEditingController,
              focusNode: inputFieldValues.focusNode,
            );
          },
        ),
      ),
    );
  }
}

动态类型标签(DynamicTagController)

如果你想存储动态数据类型的标签,例如包含颜色和表情符号的对象,你可以使用DynamicTagController。这里有一个完整示例:

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

// Sample data model 
class ButtonData {
  final Color buttonColor;
  final String emoji;
  const ButtonData(this.buttonColor, this.emoji);
}

class MyWidget extends StatelessWidget {
  final _dynamicTagController = DynamicTagController<DynamicTagData<ButtonData>>();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Dynamic Tags Example')),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: TextFieldTags<DynamicTagData<ButtonData>>(
          textfieldTagsController: _dynamicTagController,
          initialTags: [
            DynamicTagData<ButtonData>(
              'cat',
              ButtonData(Color.fromARGB(255, 132, 204, 255), "😽"),
            ),
            DynamicTagData<ButtonData>(
              'penguin',
              ButtonData(Color.fromARGB(255, 255, 131, 228), '🐧'),
            ),
            DynamicTagData<ButtonData>(
              'tiger',
              ButtonData(Color.fromARGB(255, 222, 255, 132), '🐯'),
            ),
          ],
          textSeparators: const [' ', ','],
          validator: (DynamicTagData<ButtonData> tag) {
            if (tag.tag == 'lion') {
              return 'Not invited per tiger request';
            } else if (_dynamicTagController.getTags!
                .any((element) => element.tag == tag.tag)) {
              return 'Already in the club';
            }
            return null;
          },
          inputFieldBuilder: (context, inputFieldValues) {
            return TextField(
              controller: inputFieldValues.textEditingController,
              focusNode: inputFieldValues.focusNode,
            );
          },
        ),
      ),
    );
  }
}

自定义控制器

对于更高级的功能需求,可以通过继承TextfieldTagsController类来创建自定义控制器。这里展示了一个简单的例子,它实现了一个数字标签选择器,允许用户从2到10之间选择数字(但不允许选择8):

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

// Create my own custom controller
class MyIntTagController<T extends int> extends TextfieldTagsController<T> {
  @override
  bool? onTagSubmitted(T value) {
    String? validate = getValidator != null ? getValidator!(value) : null;
    if (validate == null && value > 2 && value < 10) {
      bool? addTag = super.addTag(value);
      if (addTag == true) {
        setError = null;
        scrollTags();
      }
    } else if (validate != null) {
      setError = validate;
    } else {
      setError = 'Must enter numbers between 2 and 10';
    }
    return null;
  }

  @override
  set setError(String? error) {
    super.setError = error;
    notifyListeners();
  }

  doOtherThings() {
    // Additional logic here
  }
}

class MyWidget extends StatelessWidget {
  final _myintTagController = MyIntTagController<int>();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Custom Tags Example')),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: TextFieldTags<int>(
          textfieldTagsController: _myintTagController,
          initialTags: [4, 5],
          validator: (int tag) {
            if (tag == 8) {
              return '8 is not allowed';
            }
            return null;
          },
          inputFieldBuilder: (context, inputFieldValues) {
            return TextField(
              controller: inputFieldValues.textEditingController,
              focusNode: inputFieldValues.focusNode,
            );
          },
        ),
      ),
    );
  }
}

以上就是textfield_tags插件的基本用法以及一些常见场景下的应用实例。希望这些信息能帮助你在项目中更好地利用这个强大的工具!


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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用textfield_tags插件的示例代码。这个插件允许用户在TextField中输入标签,类似于许多社交媒体和电子邮件应用中的标签输入功能。

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

dependencies:
  flutter:
    sdk: flutter
  textfield_tags: ^2.0.1  # 请检查最新版本号并替换

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

接下来,在你的Dart文件中使用TextfieldTags组件。以下是一个完整的示例:

import 'package:flutter/material.dart';
import 'package:textfield_tags/textfield_tags.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> _tags = [];

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Textfield Tags Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: TagsTextField(
          controller: _controller,
          initialTags: _tags,
          onChanged: (tags) {
            setState(() {
              _tags = tags;
            });
          },
          suggestions: ['Flutter', 'Dart', 'React', 'Angular', 'Vue'],
          decoration: InputDecoration(
            border: OutlineInputBorder(),
            labelText: 'Enter tags',
            hintText: 'Press enter to add a tag',
          ),
          maxTags: 5,  // 限制最多5个标签
        ),
      ),
    );
  }
}

代码解释

  1. 依赖添加:在pubspec.yaml文件中添加textfield_tags依赖。
  2. 导入包:在Dart文件中导入textfield_tags包。
  3. 状态管理:使用StatefulWidget来管理标签的状态,因为标签列表可能会动态变化。
  4. 控制器:使用TextEditingController来控制TextField的文本。
  5. TagsTextField:使用TagsTextField组件来创建标签输入框。
    • controller:绑定到TextEditingController
    • initialTags:初始标签列表。
    • onChanged:当标签变化时的回调,更新状态中的标签列表。
    • suggestions:提供自动完成建议的标签列表。
    • decoration:输入框的装饰,包括边框、标签文本和提示文本。
    • maxTags:限制最多可以输入的标签数量。

这样,你就创建了一个带有标签输入功能的Flutter应用。用户可以通过输入文本并按回车键来添加标签,同时可以从建议列表中选择标签。

回到顶部