Flutter标签管理插件flutter_tagging_plus的使用

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

Flutter标签管理插件flutter_tagging_plus的使用

flutter_tagging_plus 是一个基于 flutter_tagging 的标签管理插件,提供了标签或多重选择的功能,非常适合用于添加标签或标签选择表单。本文将介绍如何使用该插件,并提供一个完整的示例代码。

插件简介

flutter_tagging_plus 提供了以下功能:

  • 标签输入和管理
  • 自定义建议项配置
  • 支持新增标签
  • 标签显示自定义

示例效果

DEMO

使用步骤

1. 添加依赖

在你的 pubspec.yaml 文件中添加 flutter_tagging_plus 依赖:

dependencies:
  flutter_tagging_plus: ^latest_version

运行 flutter pub get 安装依赖。

2. 创建语言服务类

首先,我们需要创建一个语言服务类来模拟从网络获取数据的过程。这里我们使用 Future 来模拟延迟加载数据。

class LanguageService {
  /// Mocks fetching language from network API with delay of 500ms.
  static Future<List<Language>> getLanguages(String query) async {
    await Future.delayed(Duration(milliseconds: 500), null);
    return <Language>[
      Language(name: 'JavaScript', position: 1),
      Language(name: 'Python', position: 2),
      Language(name: 'Java', position: 3),
      Language(name: 'PHP', position: 4),
      Language(name: 'C#', position: 5),
      Language(name: 'C++', position: 6),
    ].where((lang) => lang.name.toLowerCase().contains(query.toLowerCase())).toList();
  }
}

3. 创建标签类

接下来,我们需要创建一个标签类 Language,该类需要继承 Taggable 接口,并实现必要的方法。

class Language extends Taggable {
  final String name;
  final int position;

  Language({required this.name, required this.position});

  [@override](/user/override)
  List<Object> get props => [name];

  String toJson() => '''{
    "name": "$name",
    "position": $position
  }''';
}

4. 使用 FlutterTagging 组件

现在我们可以使用 FlutterTagging 组件来实现标签管理功能。以下是一个完整的示例:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Flutter Tagging Demo',
      theme: ThemeData(
        primarySwatch: Colors.green,
        scaffoldBackgroundColor: Colors.white,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  List<Language> _selectedLanguages = [];

  [@override](/user/override)
  void initState() {
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Tagging Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: FlutterTagging<Language>(
          initialItems: _selectedLanguages,
          textFieldConfiguration: TextFieldConfiguration(
            decoration: InputDecoration(
              border: InputBorder.none,
              filled: true,
              fillColor: Colors.green.withAlpha(30),
              hintText: 'Search Tags',
              labelText: 'Select Tags',
            ),
          ),
          findSuggestions: LanguageService.getLanguages,
          additionCallback: (value) {
            return Language(
              name: value,
              position: 0,
            );
          },
          onAdded: (language) {
            // api calls here, triggered when add to tag button is pressed
            return Language(name: language.name, position: -1);
          },
          configureSuggestion: (lang) {
            return SuggestionConfiguration(
              title: Text(lang.name),
              subtitle: Text(lang.position.toString()),
              additionWidget: Chip(
                avatar: Icon(
                  Icons.add_circle,
                  color: Colors.white,
                ),
                label: Text('Add New Tag'),
                labelStyle: TextStyle(
                  color: Colors.white,
                  fontSize: 14.0,
                  fontWeight: FontWeight.w300,
                ),
                backgroundColor: Colors.green,
              ),
            );
          },
          configureChip: (lang) {
            return ChipConfiguration(
              label: Text(lang.name),
              backgroundColor: Colors.green,
              labelStyle: TextStyle(color: Colors.white),
              deleteIconColor: Colors.white,
            );
          },
          onChanged: () {
            setState(() {});
          },
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用flutter_tagging_plus插件的详细代码示例。flutter_tagging_plus是一个流行的Flutter插件,用于实现标签管理功能。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  flutter_tagging_plus: ^x.y.z  # 请替换为最新版本号

然后运行flutter pub get来获取依赖。

2. 导入插件

在你的Dart文件中导入插件:

import 'package:flutter_tagging_plus/flutter_tagging_plus.dart';

3. 使用TagController

你需要创建一个TagController实例来管理标签。

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

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

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

class TagScreen extends StatefulWidget {
  @override
  _TagScreenState createState() => _TagScreenState();
}

class _TagScreenState extends State<TagScreen> {
  late final TagController _tagController;

  @override
  void initState() {
    super.initState();
    _tagController = TagController(
      initialTags: ['Tag1', 'Tag2', 'Tag3'],  // 初始标签
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Tagging Plus Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            // 显示标签
            TagInput(
              tagController: _tagController,
              decoration: InputDecoration(
                border: OutlineInputBorder(),
                labelText: 'Tags',
                helperText: 'Press enter to add a tag',
              ),
            ),

            // 显示已添加的标签
            SizedBox(height: 16),
            Text('Selected Tags:', style: TextStyle(fontSize: 18)),
            SizedBox(height: 8),
            Wrap(
              spacing: 8,
              runSpacing: 8,
              children: _tagController.tags.map((tag) => Chip(
                label: Text(tag),
                onDelete: () => _tagController.removeTag(tag),
              )).toList(),
            ),
          ],
        ),
      ),
    );
  }
}

4. 运行应用

确保你的开发环境已经正确配置,然后运行flutter run来启动你的应用。

解释

  • TagController: 用于管理标签的状态,包括添加、删除和获取标签。
  • TagInput: 一个用于输入标签的输入框。当用户输入并按下回车键时,新的标签会被添加到TagController中。
  • Chip: 用于显示已添加的标签,并允许用户通过点击删除图标来删除标签。

这个示例展示了如何使用flutter_tagging_plus插件来管理标签,包括添加和删除标签,并在UI中显示它们。根据你的需求,你可以进一步自定义和扩展这个示例。

回到顶部