Flutter文本提及插件flutter_mentions的使用

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

Flutter文本提及插件flutter_mentions的使用

flutter_mentions 是一个用于在Flutter应用中添加“@”提及功能的简单输入小部件。本文将介绍如何安装和使用这个插件,并提供一个完整的示例代码。

安装 📦

首先,您需要在 pubspec.yaml 文件中添加 flutter_mentions 依赖项:

dependencies:
  flutter:
    sdk: flutter
  flutter_mentions:

然后,在终端中运行以下命令以获取包:

flutter packages get

使用 💻

要使用此包,必须先用 Portal 包裹您的顶级小部件,因为该包使用 flutter_portal 来显示建议列表。

示例代码

下面是一个完整的示例,展示如何使用 FlutterMentions 小部件来实现提及功能。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      builder: (_, child) => Portal(child: child!),
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

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

  final String? title;

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

class _MyHomePageState extends State<MyHomePage> {
  GlobalKey<FlutterMentionsState> key = GlobalKey<FlutterMentionsState>();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title!),
      ),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.end,
        children: <Widget>[
          ElevatedButton(
            child: Text('Get Text'),
            onPressed: () {
              print(key.currentState!.controller!.markupText);
            },
          ),
          Container(
            child: FlutterMentions(
              key: key,
              suggestionPosition: SuggestionPosition.Top,
              maxLines: 5,
              minLines: 1,
              decoration: InputDecoration(hintText: 'hello'),
              mentions: [
                Mention(
                    trigger: '@',
                    style: TextStyle(
                      color: Colors.amber,
                    ),
                    data: [
                      {
                        'id': '61as61fsa',
                        'display': 'fayeedP',
                        'full_name': 'Fayeed Pawaskar',
                        'photo':
                            'https://images.pexels.com/photos/220453/pexels-photo-220453.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=650&w=940'
                      },
                      {
                        'id': '61asasgasgsag6a',
                        'display': 'khaled',
                        'full_name': 'DJ Khaled',
                        'style': TextStyle(color: Colors.purple),
                        'photo':
                            'https://images.pexels.com/photos/220453/pexels-photo-220453.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=650&w=940'
                      },
                      {
                        'id': 'asfgasga41',
                        'display': 'markT',
                        'full_name': 'Mark Twain',
                        'photo':
                            'https://images.pexels.com/photos/220453/pexels-photo-220453.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=650&w=940'
                      },
                      {
                        'id': 'asfsaf451a',
                        'display': 'JhonL',
                        'full_name': 'Jhon Legend',
                        'photo':
                            'https://images.pexels.com/photos/220453/pexels-photo-220453.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=650&w=940'
                      },
                    ],
                    matchAll: false,
                    suggestionBuilder: (data) {
                      return Container(
                        padding: EdgeInsets.all(10.0),
                        child: Row(
                          children: <Widget>[
                            CircleAvatar(
                              backgroundImage: NetworkImage(
                                data['photo'],
                              ),
                            ),
                            SizedBox(
                              width: 20.0,
                            ),
                            Column(
                              crossAxisAlignment: CrossAxisAlignment.start,
                              children: <Widget>[
                                Text(data['full_name']),
                                Text('@${data['display']}'),
                              ],
                            )
                          ],
                        ),
                      );
                    }),
                Mention(
                  trigger: '#',
                  disableMarkup: true,
                  style: TextStyle(
                    color: Colors.blue,
                  ),
                  data: [
                    {'id': 'reactjs', 'display': 'reactjs'},
                    {'id': 'javascript', 'display': 'javascript'},
                  ],
                  matchAll: true,
                )
              ],
            ),
          ),
        ],
      ),
    );
  }
}

关键点解释

  • Portal: 必须在顶级小部件上包裹 Portal,以便正确显示建议列表。
  • FlutterMentions: 这是核心的小部件,用于实现提及功能。
  • Mention: 定义了触发字符、样式以及数据列表等属性。
  • suggestionBuilder: 用于自定义建议列表中的每个项目的UI。

通过上述步骤和示例代码,您可以轻松地在Flutter应用中集成提及功能。希望这些信息对您有所帮助!如果有任何问题或建议,请随时提出。


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

1 回复

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


当然,以下是如何在Flutter项目中使用flutter_mentions插件的一个基本示例。这个插件允许你在文本字段中实现提及功能,类似于社交媒体应用中的@提及功能。

首先,确保你已经在pubspec.yaml文件中添加了flutter_mentions依赖:

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

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

接下来,在你的Flutter项目中,你可以按照以下步骤使用flutter_mentions插件:

  1. 导入插件
import 'package:flutter_mentions/flutter_mentions.dart';
  1. 定义提及项的数据源

通常,你会有一个用户列表或其他可提及的项列表。这里我们用一个简单的列表作为示例:

List<Mention> users = [
  Mention(id: '1', display: '@Alice'),
  Mention(id: '2', display: '@Bob'),
  Mention(id: '3', display: '@Charlie'),
];
  1. 创建提及控制器
final MentionsController _controller = MentionsController(
  textEditingController: TextEditingController(),
  suggestions: users,
  onChanged: (text) {
    print("Text changed to: $text");
  },
  onSubmit: (mention) {
    print("Mention submitted: ${mention.display}");
  },
);
  1. 在UI中使用Mentions小部件
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Mentions Example'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(8.0),
          child: MentionsField(
            controller: _controller,
            decoration: InputDecoration(
              border: OutlineInputBorder(),
              labelText: 'Type a message...',
              hintText: 'Type @ to mention someone',
            ),
            suffixIcon: IconButton(
              icon: Icon(Icons.send),
              onPressed: () {
                // Handle send action, e.g., submit the text
                _controller.textEditingController.clear();
              },
            ),
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个MentionsController,它管理文本输入和提及建议。然后,我们在MentionsField小部件中使用这个控制器,它允许用户在文本字段中输入文本并提及用户。

注意

  • MentionsControllertextEditingController属性用于管理文本输入。
  • suggestions属性是一个Mention对象的列表,代表可提及的项。
  • onChanged回调在文本更改时被调用。
  • onSubmit回调在用户选择并提交一个提及项时被调用。

这个示例提供了一个基本框架,你可以根据自己的需求进一步自定义和扩展。例如,你可以从服务器加载提及项列表,或者处理更复杂的文本格式化。

回到顶部