Flutter表情选择器插件emoji_picker_flutter的使用

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

Flutter表情选择器插件emoji_picker_flutter的使用

插件介绍

emoji_picker_flutter 是一个用于Flutter项目的表情选择器插件,具有以下特点:

  • 轻量级包:资源占用少。
  • 快速加载:启动和切换表情类别时响应迅速。
  • 空安全(Null-safety):支持Flutter的空安全特性。
  • 完全可定制:可以自定义表情视图、皮肤色调配置等。
  • Material Design 和 Cupertino 模式:兼容两种设计风格。
  • 过滤无法显示的表情(仅限Android):确保所有表情都能正确显示。
  • 最近使用表情选项:提供最近使用表情的标签页。
  • 肤色支持:部分表情可以选择不同的肤色。
  • 自定义字体支持:允许使用自定义字体来显示表情。
  • 搜索功能:内置表情搜索功能。
  • 多语言支持:支持8种语言。

emoji_picker_flutter

快速开始

安装

pubspec.yaml 文件中添加依赖:

dependencies:
  emoji_picker_flutter: ^latest_version

示例代码

下面是一个完整的示例代码,展示了如何在Flutter项目中集成并使用 emoji_picker_flutter 插件:

import 'package:emoji_picker_flutter/emoji_picker_flutter.dart';
import 'package:flutter/foundation.dart' as foundation;
import 'package:flutter/material.dart';

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

/// Example for EmojiPicker
class MyApp extends StatefulWidget {
  const MyApp({super.key});

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

class MyAppState extends State<MyApp> {
  final _controller = TextEditingController();
  final _scrollController = ScrollController();
  bool _emojiShowing = false;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        backgroundColor: Colors.white,
        appBar: AppBar(
          title: const Text('Emoji Picker Example App'),
        ),
        body: SafeArea(
          child: Column(
            children: [
              Expanded(
                child: Center(
                  child: ValueListenableBuilder(
                    valueListenable: _controller,
                    builder: (context, text, child) {
                      return Text(
                        _controller.text,
                      );
                    },
                  ),
                ),
              ),
              Container(
                  height: 66.0,
                  color: Colors.blue,
                  child: Row(
                    children: [
                      Material(
                        color: Colors.transparent,
                        child: IconButton(
                          onPressed: () {
                            setState(() {
                              _emojiShowing = !_emojiShowing;
                            });
                          },
                          icon: const Icon(
                            Icons.emoji_emotions,
                            color: Colors.white,
                          ),
                        ),
                      ),
                      Expanded(
                        child: Padding(
                          padding: const EdgeInsets.symmetric(vertical: 8.0),
                          child: TextField(
                              controller: _controller,
                              scrollController: _scrollController,
                              style: const TextStyle(
                                fontSize: 20.0,
                                color: Colors.black87,
                              ),
                              maxLines: 1,
                              decoration: InputDecoration(
                                hintText: 'Type a message',
                                filled: true,
                                fillColor: Colors.white,
                                contentPadding: const EdgeInsets.only(
                                  left: 16.0,
                                  bottom: 8.0,
                                  top: 8.0,
                                  right: 16.0,
                                ),
                                border: OutlineInputBorder(
                                  borderRadius: BorderRadius.circular(50.0),
                                ),
                              )),
                        ),
                      ),
                      Material(
                        color: Colors.transparent,
                        child: IconButton(
                            onPressed: () {
                              // send message
                            },
                            icon: const Icon(
                              Icons.send,
                              color: Colors.white,
                            )),
                      )
                    ],
                  )),
              Offstage(
                offstage: !_emojiShowing,
                child: EmojiPicker(
                  textEditingController: _controller,
                  scrollController: _scrollController,
                  config: Config(
                    height: 256,
                    checkPlatformCompatibility: true,
                    viewOrderConfig: const ViewOrderConfig(),
                    emojiViewConfig: EmojiViewConfig(
                      // Issue: https://github.com/flutter/flutter/issues/28894
                      emojiSizeMax: 28 *
                          (foundation.defaultTargetPlatform ==
                                  TargetPlatform.iOS
                              ? 1.2
                              : 1.0),
                    ),
                    skinToneConfig: const SkinToneConfig(),
                    categoryViewConfig: const CategoryViewConfig(),
                    bottomActionBarConfig: const BottomActionBarConfig(),
                    searchViewConfig: const SearchViewConfig(),
                  ),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }

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

关键参数说明

  • onEmojiSelected: 当用户选择表情时触发的回调函数。
  • onBackspacePressed: 当用户点击退格按钮时触发的回调函数。
  • textEditingController: 连接到输入框的 TextEditingController 实例。
  • config: 表情选择器的配置项,包括高度、背景颜色、平台兼容性检查等。

配置项详解

属性 描述 默认值
height 表情选择器的高度 256
viewOrderConfig 类别视图、表情视图和底部栏的顺序配置 const ViewOrderConfig()
checkPlatformCompatibility 是否过滤掉平台无法渲染的表情(仅限Android) true
emojiSet 自定义表情集,基于库提供的 defaultEmojiSet 构建 null
emojiTextStyle 应用到单个表情图标上的文本样式,可用于定义自定义表情字体 null
customBackspaceIcon 自定义退格按钮图标 null
customSearchIcon 自定义搜索按钮图标 null
emojiViewConfig 表情视图配置 const EmojiViewConfig()
skinToneConfig 皮肤色调配置 const SkinToneConfig
categoryViewConfig 类别视图配置 const CategoryViewConfig
bottomActionBarConfig 底部操作栏配置 const BottomActionBarConfig()
searchViewConfig 搜索视图配置 const SearchViewConfig

扩展使用

使用 EmojiPickerUtils

EmojiPickerUtils 提供了一些扩展功能,例如获取最近使用的表情、根据关键词搜索表情、设置表情样式等。具体用法如下:

// 获取最近使用的表情
final recentEmojis = await EmojiPickerUtils().getRecentEmojis();

// 根据关键词搜索相关表情
final filterEmojiEntities = await EmojiPickerUtils().searchEmoji("face", defaultEmojiSet);

// 将表情添加到最近使用列表或增加其计数
final newRecentEmojis = await EmojiPickerUtils().addEmojiToRecentlyUsed(key: key, emoji: emoji);

// 设置表情样式
final textSpans = EmojiPickerUtils().setEmojiTextStyle('text', emojiStyle: style);

// 清除最近使用表情列表
EmojiPickerUtils().clearRecentEmojis(key: key);

多语言支持

emoji_picker_flutter 支持多种语言,默认支持的语言有:en、de、es、fr、hi、it、ja、pt、ru、zh。你可以通过设置 locale 参数来选择语言:

Config(
  locale: const Locale("ja"),
)

如果你需要支持更多语言,可以通过创建新的表情集文件并翻译内容来实现。

自定义视图

如果你想进一步自定义表情选择器的外观,可以通过继承 EmojiPickerView 或设置 customWidget 来实现。

class CustomView extends EmojiPickerView {
  CustomView(Config config, EmojiViewState state, VoidCallback showSearchBar,
      {super.key})
      : super(
          config,
          state,
          showSearchBar,
        );

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

class _CustomViewState extends State<CustomView> {
  @override
  Widget build(BuildContext context) {
    // 自定义构建逻辑
    return Container();
  }
}

EmojiPicker(
  onEmojiSelected: (category, emoji) {/* ...*/},
  config: Config(/* ...*/),
  customWidget: (config, state, showSearchView) => CustomView(
    config,
    state,
    showSearchView,
  ),
)

贡献与反馈

欢迎贡献代码或提出改进建议!如果有任何问题或需求,请在GitHub上提交Issue。


以上就是关于 emoji_picker_flutter 插件的详细介绍和使用方法,希望对你有所帮助!


更多关于Flutter表情选择器插件emoji_picker_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter表情选择器插件emoji_picker_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用emoji_picker_flutter插件的代码示例。这个插件允许你在Flutter应用中集成一个表情选择器。

步骤 1: 添加依赖

首先,在你的pubspec.yaml文件中添加emoji_picker_flutter依赖:

dependencies:
  flutter:
    sdk: flutter
  emoji_picker_flutter: ^0.7.0  # 请检查最新版本号

步骤 2: 运行 Flutter Pub Get

保存pubspec.yaml文件后,在终端中运行以下命令来获取依赖:

flutter pub get

步骤 3: 使用 Emoji Picker

接下来,在你的Flutter应用中实现表情选择器。以下是一个简单的示例,展示了如何在一个按钮点击事件中显示表情选择器,并将选中的表情显示在TextWidget中。

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

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

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

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String selectedEmoji = '';

  void _pickEmoji() {
    showDialog(
      context: context,
      builder: (context) {
        return AlertDialog(
          title: Text('Pick an Emoji'),
          content: SingleChildScrollView(
            child: Column(
              mainAxisSize: MainAxisSize.min,
              children: <Widget>[
                EmojiPicker(
                  onEmojiSelected: (emoji, category) {
                    setState(() {
                      selectedEmoji = emoji.emoji;
                    });
                    Navigator.of(context).pop();
                  },
                  initCategory: Category.recent,
                  emojiSize: 30.0,
                ),
              ],
            ),
          ),
          actions: <Widget>[
            FlatButton(
              child: Text('Cancel'),
              onPressed: () {
                Navigator.of(context).pop();
              },
            ),
          ],
        );
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Emoji Picker Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Selected Emoji: $selectedEmoji',
              style: TextStyle(fontSize: 24),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _pickEmoji,
              child: Text('Pick Emoji'),
            ),
          ],
        ),
      ),
    );
  }
}

解释

  1. 添加依赖:在pubspec.yaml文件中添加emoji_picker_flutter依赖。
  2. 运行flutter pub get:确保依赖被正确下载和安装。
  3. 使用Emoji Picker
    • 创建一个按钮,点击时调用_pickEmoji方法。
    • _pickEmoji方法使用showDialog显示一个包含EmojiPicker的对话框。
    • EmojiPickeronEmojiSelected回调用于处理选中的表情,并更新状态。
    • 使用setState方法更新UI以显示选中的表情。

这个示例展示了如何使用emoji_picker_flutter插件来在Flutter应用中集成一个表情选择器,并处理用户选择的表情。你可以根据需要进一步自定义和扩展这个示例。

回到顶部