Flutter表情与GIF选择插件flutter_emoji_gif_picker的使用

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

Flutter表情与GIF选择插件 flutter_emoji_gif_picker 的使用

flutter_emoji_gif_picker 是一个基于 WhatsApp 表情选择器设计的 Flutter 插件,提供了丰富的功能和易于使用的接口。本文将介绍如何使用该插件,并提供完整的示例代码。

功能特性

  • 包含表情图标小部件和文本框
  • 支持 GIF 菜单(通过 Giphy API)
  • 暗/亮模式支持
  • 解决了其他表情选择器中常见的键盘问题
  • 提供返回按钮事件处理(类似于 WhatsApp)
  • 支持所有平台
  • 轻量级,加载速度快
  • 可自定义设计
  • 表情/GIF 搜索栏
  • 提供菜单展开时页面大小调整选项

快速开始

基本设置

只需设置你的 Giphy API 密钥并选择模式(暗/亮)即可:

EmojiGifPickerPanel.setup(
    giphyApiKey: "yourgiphyapikey", mode: Mode.light);

自定义设置

可以通过传递更多的参数来自定义面板:

EmojiGifPickerPanel.setup(
    sizes: MenuSizes(width: 2000, height: 500),
    texts: MenuTexts(
        searchEmojiHintText: "Search Emoji?",
        searchGifHintText: "Search with Giphy"),
    colors: MenuColors(
      backgroundColor: const Color(0xFFf6f5f3),
      searchBarBackgroundColor: Colors.white,
      searchBarBorderColor: const Color(0xFFe6e5e2),
      searchBarEnabledColor: Colors.white,
      searchBarFocusedColor: const Color(0xFF00a884),
      menuSelectedIconColor: const Color(0xFF1d6e5f),
      buttonColor: const Color(0xFF909090),
      iconBackgroundColor: null,
      iconHoveredBackgroundColor: const Color.fromARGB(255, 224, 224, 224),
      indicatorColor: Colors.transparent,
    ),
    styles: MenuStyles(
        menuSelectedTextStyle:
            const TextStyle(fontSize: 20, color: Colors.black),
        menuUnSelectedTextStyle:
            const TextStyle(fontSize: 20, color: Color(0xFF7a7a7a)),
        searchBarHintStyle:
            const TextStyle(fontSize: 12, color: Color(0xFF8d8d8d)),
        searchBarTextStyle:
            const TextStyle(fontSize: 12, color: Colors.black)),
    giphyApiKey: "yourgiphyapikey",
    mode: Mode.light);

修改 MaterialApp 的 builder

为了确保插件能够正常工作,需要修改 MaterialAppbuilder 方法:

return MaterialApp(
  theme: ThemeData(
    primarySwatch: Colors.blue,
  ),
  builder: (context, child) {
    return Stack(
      children: [
        child!,
        EmojiGifMenuStack(),
      ],
    );
  },
  home: const MyHomePage(),
);

是否应让表情/GIF选择器调整页面大小?

如果希望打开表情/GIF选择器时自动调整页面大小,则需要将其包裹在 EmojiGifMenuLayout 中,并设置 fromStack: false

EmojiGifMenuLayout(
  child: YourDesign(),
)

EmojiGifPickerIcon(
  id: "1",
  onGifSelected: (gif) {},
  fromStack: false,
  controller: controller,
  icon: Icon(Icons.emoji_emotions),
)

返回按钮问题

当按下返回按钮时,如果希望关闭表情/GIF选择器而不是切换页面,可以使用 WillPopScope

return WillPopScope(
    onWillPop: (() async {
      return EmojiGifPickerPanel.onWillPop();
    }),
    child: Scaffold(
)

EmojiGifPickerIcon & EmojiGifTextField

这两个组件是显示选择器所必需的。给每个选择器组件指定一个唯一的 ID,以便可以在同一页面上多次使用这些组件。

Icon 示例

EmojiGifPickerIcon(
    id: "1",
    onGifSelected: (gif) {},
    controller: controller,
    viewEmoji: true,
    viewGif: true,
    icon: Icon(Icons.emoji_emotions),
)

TextField 示例

EmojiGifTextField(
     id: "1",
)

完整视图示例

Row(
  mainAxisAlignment: MainAxisAlignment.center,
  children: [
    EmojiGifPickerIcon(
      id: "2",
      onGifSelected: (gif) {},
      controller: controller2,
      icon: Icon(Icons.emoji_emotions),
    ),
    SizedBox(
        width: MediaQuery.of(context).size.width * 0.6,
        child: EmojiGifTextField(
          id: "2",
          decoration: InputDecoration(
            enabledBorder: OutlineInputBorder(
                borderSide: BorderSide(color: Colors.black),
                borderRadius: BorderRadius.circular(30)),
            focusedBorder: OutlineInputBorder(
                borderSide: BorderSide(color: Colors.blue),
                borderRadius: BorderRadius.circular(30)),
          ),
        )),
  ],
)

完整可用示例

以下是一个完整的示例应用:

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

void main() {
  EmojiGifPickerPanel.setup(
      giphyApiKey: "yourgiphyapikey", mode: Mode.light);
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      builder: (context, child) {
        return Stack(
          children: [
            child!,
            EmojiGifMenuStack(),
          ],
        );
      },
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  TextEditingController controller = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return WillPopScope(
        onWillPop: (() async {
          return EmojiGifPickerPanel.onWillPop();
        }),
        child: Scaffold(
            resizeToAvoidBottomInset: true,
            body: EmojiGifMenuLayout(
              child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [
                EmojiGifPickerIcon(
                  id: "1",
                  onGifSelected: (gif) {},
                  controller: controller,
                  icon: Icon(Icons.emoji_emotions),
                ),
                SizedBox(
                    width: MediaQuery.of(context).size.width * 0.3,
                    child: EmojiGifTextField(
                      id: "1",
                      decoration: InputDecoration(
                        enabledBorder: OutlineInputBorder(
                            borderSide: BorderSide(color: Colors.black),
                            borderRadius: BorderRadius.circular(30)),
                        focusedBorder: OutlineInputBorder(
                            borderSide: BorderSide(color: Colors.blue),
                            borderRadius: BorderRadius.circular(30)),
                      ),
                    )),
              ]),
            )));
  }
}

通过以上步骤,你就可以在 Flutter 应用中集成表情和 GIF 选择器了。如果你有更多自定义需求,可以根据插件提供的 API 进行进一步配置。


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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用flutter_emoji_gif_picker插件的代码示例。这个插件允许用户从预设的表情和GIF中选择内容,非常适合用于聊天应用或社交媒体应用。

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

dependencies:
  flutter:
    sdk: flutter
  flutter_emoji_gif_picker: ^latest_version  # 请替换为最新版本号

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

接下来,你可以在你的Flutter项目中导入并使用这个插件。以下是一个简单的示例,展示如何集成并使用flutter_emoji_gif_picker

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

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  String? selectedContent;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Emoji & GIF Picker Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              selectedContent ?? 'No content selected',
              style: TextStyle(fontSize: 24),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () => _pickEmojiOrGif(context),
              child: Text('Pick Emoji or GIF'),
            ),
          ],
        ),
      ),
    );
  }

  Future<void> _pickEmojiOrGif(BuildContext context) async {
    final result = await FlutterEmojiGifPicker.showPicker(
      context,
      pickerConfig: PickerConfig(
        initialPicker: PickerType.emoji, // 默认打开的表情选择器
        gifSearchText: 'happy', // GIF搜索关键词
        limit: 20, // 限制结果数量
      ),
    );

    if (result != null) {
      setState(() {
        if (result.isGif) {
          // 如果选择了GIF
          selectedContent = result.data.gifUrl;
        } else {
          // 如果选择了表情
          selectedContent = result.data.emoji;
        }
      });
    }
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个按钮,用于打开表情或GIF选择器。当用户从选择器中选择一个表情或GIF时,选择的内容将显示在按钮下方的文本中。

  • FlutterEmojiGifPicker.showPicker 方法用于显示选择器。
  • PickerConfig 允许你配置选择器的初始类型、GIF搜索关键词和结果数量限制等。
  • 选择完成后,result 将包含用户选择的内容,你可以根据result.isGif来判断是GIF还是表情,并相应地更新UI。

确保你已经正确设置了Android和iOS的权限,因为GIF选择器可能需要访问网络来搜索和加载GIF。

希望这个示例对你有所帮助!如果你有任何其他问题,请随时询问。

回到顶部