Flutter标签编辑插件super_tag_editor的使用

Flutter标签编辑插件super_tag_editor的使用

Super Tag Editor

Super Tag Editor 是一个用于Flutter应用中简单输入标签的小部件。它具有如下增强功能:

  • 建议框:在用户输入时提供可能的选项。
  • 验证:确保输入的内容符合预期。

Super Tag Editor 动图

使用方法

添加依赖

首先,在pubspec.yaml文件中添加super_tag_editor包:

dependencies:
  super_tag_editor: ^latest_version # 替换为最新版本号

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

导入包

在需要使用的Dart文件中导入super_tag_editor

import 'package:super_tag_editor/tag_editor.dart';

使用组件

下面是一个完整的示例,展示了如何在项目中使用TagEditor小部件。这个例子创建了一个可以添加、删除和从建议列表选择标签的文本框。

import 'package:flutter/material.dart';
import 'package:super_tag_editor/tag_editor.dart';

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

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

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, this.title}) : super(key: key);

  final String? title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  static const mockResults = [
    'dat@gmail.com',
    'dab246@gmail.com',
    // 更多模拟数据...
  ];

  List<String> _values = [];
  final FocusNode _focusNode = FocusNode();
  final TextEditingController _textEditingController = TextEditingController();

  void _onDelete(int index) {
    setState(() {
      _values.removeAt(index);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title ?? ''),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: ListView(
          children: <Widget>[
            TagEditor<String>(
              length: _values.length,
              controller: _textEditingController,
              focusNode: _focusNode,
              delimiters: [',', ' '],
              hasAddButton: true,
              resetTextOnSubmitted: true,
              inputDecoration: const InputDecoration(
                border: InputBorder.none,
                hintText: '请输入标签...',
              ),
              onTagChanged: (newValue) {
                setState(() {
                  _values.add(newValue);
                });
              },
              tagBuilder: (context, index) => _Chip(
                index: index,
                label: _values[index],
                onDeleted: _onDelete,
              ),
              findSuggestions: (String query) {
                if (query.isNotEmpty) {
                  var lowercaseQuery = query.toLowerCase();
                  return mockResults.where((profile) =>
                          profile.toLowerCase().contains(lowercaseQuery))
                      .toList(growable: false)
                        ..sort((a, b) => a
                            .toLowerCase()
                            .indexOf(lowercaseQuery)
                            .compareTo(b.toLowerCase().indexOf(lowercaseQuery)));
                }
                return [];
              },
              suggestionBuilder: (context, state, data) => ListTile(
                key: ObjectKey(data),
                title: Text(data),
                onTap: () {
                  state.selectSuggestion(data);
                },
              ),
              suggestionsBoxElevation: 10,
            ),
            const Divider(),
            ElevatedButton(
              onPressed: () {},
              child: const Text('示例按钮'),
            ),
          ],
        ),
      ),
    );
  }

  @override
  void dispose() {
    _focusNode.dispose();
    _textEditingController.dispose();
    super.dispose();
  }
}

class _Chip extends StatelessWidget {
  const _Chip({
    required this.label,
    required this.onDeleted,
    required this.index,
  });

  final String label;
  final ValueChanged<int> onDeleted;
  final int index;

  @override
  Widget build(BuildContext context) {
    return Chip(
      labelPadding: const EdgeInsets.only(left: 8.0),
      label: Text(label),
      deleteIcon: const Icon(
        Icons.close,
        size: 18,
      ),
      onDeleted: () {
        onDeleted(index);
      },
    );
  }
}

此代码片段演示了如何配置和使用TagEditor小部件,包括设置分隔符、启用添加按钮、自定义输入提示以及定义标签样式等。此外,还展示了如何通过findSuggestions方法提供自动完成建议,并通过suggestionBuilder构建每个建议项的UI。


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

1 回复

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


当然,以下是如何在Flutter项目中使用super_tag_editor插件的一个简单示例。这个插件允许用户在应用中添加、编辑和删除标签。首先,你需要确保在pubspec.yaml文件中添加了该依赖项:

dependencies:
  flutter:
    sdk: flutter
  super_tag_editor: ^最新版本号  # 请替换为实际可用的最新版本号

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

接下来,你可以在你的Flutter应用中实现标签编辑器。以下是一个完整的示例代码,展示了如何使用super_tag_editor

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

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

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

class TagEditorScreen extends StatefulWidget {
  @override
  _TagEditorScreenState createState() => _TagEditorScreenState();
}

class _TagEditorScreenState extends State<TagEditorScreen> {
  List<String> tags = ['Tag1', 'Tag2', 'Tag3'];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Tag Editor Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            Text(
              'Selected Tags:',
              style: TextStyle(fontSize: 18),
            ),
            SizedBox(height: 10),
            Expanded(
              child: SuperTagEditor(
                tags: tags,
                onChanged: (List<String> newTags) {
                  setState(() {
                    tags = newTags;
                  });
                },
                decoration: InputDecoration(
                  border: OutlineInputBorder(),
                  labelText: 'Edit Tags',
                ),
                tagStyle: TextStyle(color: Colors.white, backgroundColor: Colors.blue),
                tagCancelIcon: Icon(Icons.cancel, color: Colors.white),
                addTagIcon: Icon(Icons.add),
                addTagText: 'Add a tag',
                maxLength: 10, // 最大标签数量
              ),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中:

  1. 依赖导入:首先,我们在pubspec.yaml中添加了super_tag_editor依赖。
  2. UI结构:我们创建了一个简单的Flutter应用,包含一个AppBar和一个Scaffold,其中Scaffold的主体是一个Column,用于展示标签和标签编辑器。
  3. 标签编辑器:使用SuperTagEditor小部件来显示和编辑标签。我们传递了一个初始标签列表tags,并设置了onChanged回调,以便在标签更改时更新状态。
  4. 样式和配置:我们还配置了标签的样式(如文本颜色和背景颜色),以及添加和取消标签的图标。

运行这个应用,你将看到一个简单的界面,允许你添加、编辑和删除标签。确保你已经安装了super_tag_editor的最新版本,并根据需要调整代码以适应你的具体需求。

回到顶部