Flutter文本提及与高亮插件flutter_quill_mentions的使用

Flutter 包基于 flutter_quill 提供提及和标签功能。

特性 #

列出你的包可以做什么。可能包括图片、GIF或视频。

开始使用 #

列出先决条件,并提供或指向有关如何开始使用该包的信息。

使用 #

为用户提供简短且有用的示例。将更长的示例添加到/example文件夹。

const like = 'sample';

额外信息 #

告诉用户更多关于该包的信息:在哪里找到更多信息,如何贡献于该包,如何提交问题,他们可以期望从包作者那里得到什么响应等。

```

示例代码

引入依赖

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

dependencies:
  flutter:
    sdk: flutter
  flutter_quill_mentions: ^版本号

初始化Quill Editor

首先,确保你已经引入了 flutter_quill_mentions 包,并且初始化了 Quill Editor。

import 'package:flutter/material.dart';
import 'package:flutter_quill/flutter_quill.dart' hide Text;
import 'package:flutter_quill_mentions/flutter_quill_mentions.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Mentions Example'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(8.0),
          child: QuillEditor.basic(
            controller: QuillController(
              document: Document(),
              selection: TextSelection.collapsed(offset: 0),
            ),
            readOnly: false, // true if you want to disable editing
          ),
        ),
      ),
    );
  }
}

配置提及和标签

接下来,配置提及和标签的功能。

class MyApp extends StatelessWidget {
  final QuillController _controller = QuillController.basic();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Mentions Example'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(8.0),
          child: QuillEditor(
            controller: _controller,
            scrollController: ScrollController(),
            scrollable: true,
            focusNode: FocusNode(),
            autoFocus: true,
            readOnly: false,
            expands: false,
            padding: EdgeInsets.zero,
            customStyles: DefaultStyles(
              paragraph: DefaultTextBlockStyle(
                const TextStyle(fontSize: 16, height: 1.4),
                const Offset(0, 0),
                const Offset(0, 0),
                null,
              ),
            ),
            embedBuilders: QuillOptions.getEmbedBuilders(context),
            mentionConfigurations: [
              MentionConfiguration(
                trigger: '@', // 触发字符
                suggestionItems: [
                  MentionItem('@user1'),
                  MentionItem('@user2'),
                  MentionItem('@user3'),
                ],
                mentionSpanBuilder: (mentionItem, index) {
                  return MentionSpan(
                    mentionItem: mentionItem,
                    prefix: mentionConfigurations.first.trigger,
                    style: TextStyle(color: Colors.blue, fontWeight: FontWeight.bold),
                  );
                },
              ),
            ],
          ),
        ),
      ),
    );
  }
}

处理提及事件

你可以监听提及事件并执行相应的操作。

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

class _MyAppState extends State<MyApp> {
  final QuillController _controller = QuillController.basic();

  void _onMentionSelected(MentionItem item) {
    print('Selected mention: ${item.value}');
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Mentions Example'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(8.0),
          child: QuillEditor(
            controller: _controller,
            scrollController: ScrollController(),
            scrollable: true,
            focusNode: FocusNode(),
            autoFocus: true,
            readOnly: false,
            expands: false,
            padding: EdgeInsets.zero,
            customStyles: DefaultStyles(
              paragraph: DefaultTextBlockStyle(
                const TextStyle(fontSize: 16, height: 1.4),
                const Offset(0, 0),
                const Offset(0, 0),
                null,
              ),
            ),
            embedBuilders: QuillOptions.getEmbedBuilders(context),
            mentionConfigurations: [
              MentionConfiguration(
                trigger: '@',
                suggestionItems: [
                  MentionItem('@user1'),
                  MentionItem('@user2'),
                  MentionItem('@user3'),
                ],
                mentionSpanBuilder: (mentionItem, index) {
                  return MentionSpan(
                    mentionItem: mentionItem,
                    prefix: mentionConfigurations.first.trigger,
                    style: TextStyle(color: Colors.blue, fontWeight: FontWeight.bold),
                  );
                },
                onSuggestionSelected: (MentionItem item) {
                  _onMentionSelected(item);
                },
              ),
            ],
          ),
        ),
      ),
    );
  }
}

更多关于Flutter文本提及与高亮插件flutter_quill_mentions的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter文本提及与高亮插件flutter_quill_mentions的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flutter_quill_mentions 是一个用于 Flutter 的插件,它允许你在富文本编辑器(基于 flutter_quill)中实现提及(Mentions)功能。这个插件通常用于在文本编辑器中输入“@”符号后,显示一个用户列表(或其他可提及的项),并允许用户选择一个项,然后将其插入到文本中。

安装

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

dependencies:
  flutter:
    sdk: flutter
  flutter_quill: ^x.x.x  # 请使用最新版本
  flutter_quill_mentions: ^x.x.x  # 请使用最新版本

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

基本用法

  1. 导入包

    import 'package:flutter_quill/flutter_quill.dart';
    import 'package:flutter_quill_mentions/flutter_quill_mentions.dart';
    
  2. 创建 Mention 数据

    你需要定义一个 Mention 数据模型,通常包含 iddisplay 字段。

    class Mention {
      final String id;
      final String display;
    
      Mention({required this.id, required this.display});
    }
    
  3. 创建 Mention 列表

    创建一个包含 Mention 对象的列表,这些对象将用于在用户输入“@”符号时显示。

    final mentions = [
      Mention(id: '1', display: 'Alice'),
      Mention(id: '2', display: 'Bob'),
      Mention(id: '3', display: 'Charlie'),
    ];
    
  4. 配置 MentionOptions

    使用 MentionOptions 来配置提及功能的行为。

    final mentionOptions = MentionOptions(
      mentionBuilder: (context, mention) {
        return Text(
          mention.display,
          style: TextStyle(color: Colors.blue),
        );
      },
      onMentionAdd: (mention) {
        print('Mention added: ${mention.display}');
      },
      onMentionRemove: (mention) {
        print('Mention removed: ${mention.display}');
      },
    );
    
  5. 创建 Quill 编辑器

    使用 QuillEditorQuillToolbar 来创建一个富文本编辑器,并将 mentionOptions 传递给 QuillEditor

    final quillController = QuillController.basic();
    
    [@override](/user/override)
    Widget build(BuildContext context) {
      return Scaffold(
        appBar: AppBar(
          title: Text('Flutter Quill Mentions Example'),
        ),
        body: Column(
          children: [
            QuillToolbar.basic(controller: quillController),
            Expanded(
              child: QuillEditor(
                controller: quillController,
                scrollController: ScrollController(),
                scrollable: true,
                padding: EdgeInsets.all(10),
                autoFocus: true,
                expands: false,
                mentionOptions: mentionOptions,
              ),
            ),
          ],
        ),
      );
    }
    
  6. 处理提及

    当用户输入“@”符号时,插件会自动触发提及功能,并显示一个下拉列表,用户可以从中选择一个提及项。

自定义提及样式

你可以通过 mentionBuilder 来自定义提及项的显示样式。例如,你可以显示头像、名称等。

final mentionOptions = MentionOptions(
  mentionBuilder: (context, mention) {
    return Row(
      children: [
        CircleAvatar(
          backgroundImage: NetworkImage('https://via.placeholder.com/150'),
        ),
        SizedBox(width: 8),
        Text(mention.display),
      ],
    );
  },
);

处理提及事件

你可以通过 onMentionAddonMentionRemove 来处理提及项的添加和删除事件。

final mentionOptions = MentionOptions(
  onMentionAdd: (mention) {
    print('Mention added: ${mention.display}');
  },
  onMentionRemove: (mention) {
    print('Mention removed: ${mention.display}');
  },
);
回到顶部