Flutter标签管理插件fluttertagger的使用

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

Flutter标签管理插件fluttertagger的使用

FlutterTagger

FlutterTagger

FlutterTagger 是一个用于扩展TextField以提供标签功能的Flutter包。它适用于社交应用中需要用户提及和话题标签功能的场景。

安装 🚀

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

dependencies:
  fluttertagger: ^2.3.1

导入包到项目 📥

在你的Dart文件中导入包:

import 'package:fluttertagger/fluttertagger.dart';

使用方法 🏗️

下面是一个完整的示例代码,展示了如何使用 FlutterTagger 插件来创建一个带有标签功能的输入框,并且包含了一个发送按钮来提交内容:

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

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'FlutterTagger Demo',
      theme: ThemeData(
        textSelectionTheme: TextSelectionThemeData(
          selectionColor: Colors.redAccent.withOpacity(.3),
        ),
        primarySwatch: Colors.red,
      ),
      home: const HomeView(),
    );
  }
}

class HomeView extends StatefulWidget {
  const HomeView({Key? key}) : super(key: key);

  @override
  State<HomeView> createState() => _HomeViewState();
}

class _HomeViewState extends State<HomeView> with TickerProviderStateMixin {
  late final _controller = FlutterTaggerController(text: "Hey @exampleUser. It's time to #Flutter#!");
  late final _focusNode = FocusNode();

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.redAccent,
        title: const Text("The Squad"),
      ),
      body: Column(
        children: [
          Expanded(
            child: ListView.builder(
              itemCount: 0, // 这里可以替换为实际帖子的数量
              itemBuilder: (_, index) {
                // 返回帖子小部件
                return Container(); 
              },
            ),
          ),
          FlutterTagger(
            triggerStrategy: TriggerStrategy.eager,
            controller: _controller,
            onSearch: (query, triggerChar) {
              if (triggerChar == "@") {
                // 搜索用户逻辑
              }
              if (triggerChar == "#") {
                // 搜索话题标签逻辑
              }
            },
            triggerCharacterAndStyles: const {
              "@": TextStyle(color: Colors.pinkAccent),
              "#": TextStyle(color: Colors.blueAccent),
            },
            overlay: SearchResultOverlay(), // 自定义搜索结果视图
            builder: (context, containerKey) {
              return TextField(
                key: containerKey,
                controller: _controller,
                focusNode: _focusNode,
                decoration: InputDecoration(
                  suffixIcon: IconButton(
                    onPressed: () {
                      // 发送动作
                      final text = _controller.formattedText;
                      print('Sending message: $text');
                      FocusScope.of(context).unfocus();
                      _controller.clear();
                    },
                    icon: const Icon(Icons.send, color: Colors.redAccent),
                  ),
                ),
              );
            },
          ),
        ],
      ),
    );
  }
}

在这个例子中,我们创建了一个简单的应用程序界面,其中包含一个带有标签功能的输入框和一个发送按钮。当用户输入特定字符(如@#)时,会触发相应的搜索逻辑。此外,我们还设置了样式来区分不同的触发字符,并通过自定义的 overlay 显示搜索结果。

触发搜索

除了直接在键盘上输入触发字符外,你还可以通过更新控制器来触发搜索:

// 在发送按钮点击事件中
String text = _controller.formattedText;

// 添加触发字符以激活搜索上下文
_controller.text = text + '#';

// 更新文本选择
_controller.selection = TextSelection.fromPosition(
  TextPosition(offset: _controller.text.length),
);

// 添加其他字符以触发搜索
_controller.text += 'f';

// 再次更新文本选择
_controller.selection = TextSelection.fromPosition(
  TextPosition(offset: _controller.text.length),
);

// 调用 formatTags 以保持格式化
_controller.formatTags();

这段代码展示了如何手动添加触发字符并调用相关方法来确保正确地触发搜索逻辑。

示例演示 📷

贡献 🫱🏾‍🫲🏼

欢迎为这个项目做出贡献。如果你发现了bug或者有新的特性需求但不知道如何实现,请提交issue;如果你已经修复了bug或实现了新特性,请发送pull request

希望这篇指南能帮助你更好地理解和使用FlutterTagger插件!如果有任何问题,欢迎随时提问。


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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用fluttertagger插件来实现标签管理的示例代码。fluttertagger是一个用于管理标签的Flutter插件,它提供了易于使用的界面和丰富的功能。

首先,确保在你的pubspec.yaml文件中添加了fluttertagger的依赖:

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

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

接下来,你可以在Flutter项目中使用fluttertagger。以下是一个完整的示例,包括如何设置和展示标签管理界面:

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

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

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

class TaggerScreen extends StatefulWidget {
  @override
  _TaggerScreenState createState() => _TaggerScreenState();
}

class _TaggerScreenState extends State<TaggerScreen> {
  final List<String> initialTags = ['Tag1', 'Tag2', 'Tag3'];
  List<String> tags = [];

  @override
  void initState() {
    super.initState();
    tags = List.from(initialTags);
  }

  void handleTagChange(List<String> newTags) {
    setState(() {
      tags = newTags;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Tagger Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text(
              'Selected Tags:',
              style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
            ),
            SizedBox(height: 8),
            Wrap(
              spacing: 8,
              runSpacing: 8,
              children: tags.map((tag) => Chip(
                label: Text(tag),
                backgroundColor: Colors.blue.withOpacity(0.5),
              )).toList(),
            ),
            SizedBox(height: 24),
            Text(
              'Manage Tags:',
              style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
            ),
            SizedBox(height: 8),
            Expanded(
              child: FlutterTagger(
                initialTags: initialTags,
                onTagAdded: (tag) {
                  setState(() {
                    tags.add(tag);
                  });
                },
                onTagRemoved: (tag) {
                  setState(() {
                    tags.remove(tag);
                  });
                },
                onTagsChanged: handleTagChange,
                maxTags: 10,  // 可选,设置最大标签数量
                maxCharactersPerTag: 20,  // 可选,设置每个标签的最大字符数
                textStyle: TextStyle(fontSize: 16, color: Colors.black),
                decorator: FlutterTaggerDecorator.material(
                  withShadow: true,
                  withBorder: true,
                  borderRadius: 16,
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中:

  1. 我们创建了一个MyApp小部件作为应用的入口。
  2. TaggerScreen是主屏幕,它包含了一个标签列表和一个FlutterTagger小部件,用于管理标签。
  3. FlutterTagger小部件的initialTags属性设置了初始标签。
  4. onTagAddedonTagRemovedonTagsChanged回调用于处理标签的添加、删除和更改。
  5. maxTagsmaxCharactersPerTag属性用于限制标签的数量和每个标签的字符数。
  6. decorator属性用于自定义标签的外观。

这个示例展示了如何使用fluttertagger插件在Flutter应用中实现标签管理功能。你可以根据需要进一步自定义和扩展这个示例。

回到顶部