搜尋套件、儲存庫與 APP 分類

emoji_keyboard_flutter 封面
套件詳情v1.7.5

emoji_keyboard_flutter

一個 Flutter 套件,提供只能輸入表情符號的鍵盤!

AndroidiOS
近 30 天下載
240
喜歡數
32
Pub 分數
140

安裝套件

flutter pub add emoji_keyboard_flutter

套件介紹

根據套件公開資料產生的選型評估,僅供參考。

一個 Flutter 套件,專為輸入表情符號而設計的鍵盤。它用自訂介面取代標準輸入法,使用者只能選擇和輸入表情符號,非常適合用於輕鬆或富有表現力的溝通。此鍵盤設計輕巧,可無縫整合至 Android 與 iOS 的 Flutter 應用中。在需要僅使用表情符號互動以提升使用者體驗的情境下特別實用,例如社交應用或創意訊息平台。

適用情境

  • 僅表情符號的即時通訊應用
  • 有趣的使用者介面
  • 創意內容創作工具
  • 社群媒體整合
  • 互動式聊天功能

主要特色

  • 專用表情符號輸入
  • 跨平台支援(Android 與 iOS)
  • 輕量且易於整合
  • 可自訂的表情符號網格
  • 無縫 Flutter 結合

適合對象

  • 開發有趣或具表現力應用程式的開發者
  • 針對年輕受眾的應用
  • 訊息或社交平台
  • 以表情符號為中心的UI實驗

使用建議

  • 不適用於傳統文字輸入
  • 僅限表情符號工作流程
  • 可能需要為使用者提供額外的使用者體驗指導
  • 取決於平台鍵盤處理行為

原始 README

以下為關聯原始碼儲存庫的 README 原文快照,最新內容請造訪原始碼儲存庫。

Flutter Emoji Keyboard

pub package

A Flutter package that provides a keyboard where you can only type with emojis!

It's a keyboard the way you expect it and more! But with less letters and only emojis.

Emoji selection Skin selection Search option
Emoji selection Skin selection Search option
Emoji popup widget Recent emojis Dark or Light mode
Emoji selection Skin selection Search option

Key features

Smooth and intuitive keyboard layout with all the emojis up to unicode 16.0 available in separate 8 categories with a 'recent chosen' tab.

You can easily switch between categories by swiping or selecting the category from the top bar.

Emojis that cannot be displayed are filtered out (only for Android)

You can even search for your emoji by using the search functionality available in the bottom bar.

From this keyboard you can also delete an emoji from the position of the cursor or add a space from the bottom bar.

Determine the height of the keyboard and show or hide it using a simple variable

The emojis have an indicator which shows if you can add a skin component to them. If this is the case you can add one by long pressing the emoji and selecting a skin component from the resulting popup window.

Change the default light setting to dark mode

Instead of the keyboard you can also use the quick emoji popup widget. Select one of the many quick reaction emojis or from your recent emojis. The widget has a "+" button that you can implement to open the regular emoji keyboard.

Usage

To use this plugin, add emoji_keyboard_flutter as dependency in your pubspec.yaml file.

Full Sample Usage

import 'dart:io';
import 'package:emoji_keyboard_flutter/emoji_keyboard_flutter.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.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: 'Emoji Keyboard',
      home: MyHomePage(key: UniqueKey(), title: 'Emoji Keyboard'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({required Key key, required this.title}) : super(key: key);
  final String title;

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

class MyHomePageState extends State<MyHomePage> {
  bool showEmojiKeyboard = false;
  final TextEditingController controller = TextEditingController();
  int emojiReactionIndex = -1;
  bool showEmojiPopup = false;
  Offset emojiPopupPosition = Offset.zero;
  List<String> emojiReactions = ['', ''];
  bool darkMode = false;

  void backButtonFunctionality() {
    if (emojiReactionIndex != -1) {
      emojiReactionIndex = -1;
    }
    if (showEmojiPopup) {
      setState(() {
        showEmojiPopup = false;
      });
      return;
    }
    if (showEmojiKeyboard) {
      setState(() {
        showEmojiKeyboard = false;
      });
      return;
    }
    if (Platform.isAndroid) {
      SystemNavigator.pop();
    } else {
      exit(0);
    }
  }

  void onTapEmojiField() {
    emojiReactionIndex = -1;
    if (showEmojiPopup) {
      setState(() {
        showEmojiPopup = false;
      });
    }
    if (!showEmojiKeyboard) {
      setState(() {
        showEmojiKeyboard = true;
      });
    }
  }

  void onLongPressMessage(
      BuildContext context, LongPressStartDetails details, int messageIndex) {
    emojiReactionIndex = messageIndex;
    setState(() {
      showEmojiPopup = true;
      emojiPopupPosition = details.globalPosition;
    });
  }

  void handleEmojiPopupAction(EmojiPopupAction action) {
    showEmojiPopup = false;
    if (action is OutsideClicked) {
      emojiReactionIndex = -1;
    } else if (action is ButtonPressed) {
      showEmojiKeyboard = true;
    } else if (action is EmojiSelected) {
      final String newEmoji = action.emoji;
      if (emojiReactions[emojiReactionIndex] == newEmoji) {
        emojiReactions[emojiReactionIndex] = '';
      } else {
        emojiReactions[emojiReactionIndex] = action.emoji;
      }
      emojiReactionIndex = -1;
    }
    setState(() {});
  }

  void onActionEmojiChanged(String emoji) {
    if (emojiReactionIndex != -1) {
      emojiReactions[emojiReactionIndex] = emoji;
      emojiReactionIndex = -1;
      if (showEmojiKeyboard) {
        showEmojiKeyboard = false;
      }
      setState(() {});
    }
  }

  TextEditingController? getEmojiController() {
    if (emojiReactionIndex != -1) {
      return null;
    } else {
      return controller;
    }
  }

  Widget messageWidget(int messageIndex, String messageText) {
    return GestureDetector(
      onLongPressStart: (details) =>
          onLongPressMessage(context, details, messageIndex),
      child: Stack(
        children: [
          Container(
            width: MediaQuery.of(context).size.width,
            color: emojiReactionIndex == messageIndex
                ? Colors.cyan[200]
                : Colors.transparent,
            child: Container(
              margin: const EdgeInsets.all(8.0),
              padding: const EdgeInsets.all(12.0),
              decoration: BoxDecoration(
                color: messageIndex == 0 ? Colors.green[200] : Colors.blue[200],
                borderRadius: BorderRadius.only(
                  topLeft: messageIndex == 0
                      ? const Radius.circular(30.0)
                      : Radius.zero,
                  topRight: messageIndex == 1
                      ? const Radius.circular(30.0)
                      : Radius.zero,
                  bottomLeft: const Radius.circular(30.0),
                  bottomRight: const Radius.circular(30.0),
                ),
              ),
              child: Text(
                messageText,
                style: const TextStyle(fontSize: 16.0),
              ),
            ),
          ),
          if (emojiReactions[messageIndex] != '')
            Positioned(
              bottom: 0,
              right: 50,
              child: Container(
                padding: const EdgeInsets.all(4.0),
                decoration: BoxDecoration(
                  color: Colors.white,
                  borderRadius: BorderRadius.circular(12.0),
                ),
                child: Text(
                  emojiReactions[messageIndex],
                  style: const TextStyle(fontSize: 16.0),
                ),
              ),
            ),
        ],
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return PopScope(
      canPop: false,
      onPopInvokedWithResult: (bool didPop, result) {
        if (!didPop) {
          backButtonFunctionality();
        }
      },
      child: Scaffold(
        appBar: AppBar(
          title: Text(widget.title),
        ),
        body: Stack(
          children: [
            Column(
              children: [
                Expanded(
                  child: ListView(
                    reverse: true,
                    children: [
                      Container(
                        alignment: Alignment.topCenter,
                        padding: const EdgeInsets.only(
                            bottom: 12.0, left: 8, right: 8, top: 12),
                        child: TextFormField(
                          onTap: onTapEmojiField,
                          controller: controller,
                          decoration: const InputDecoration(
                              border: OutlineInputBorder()),
                          readOnly: true,
                          showCursor: true,
                        ),
                      ),
                      messageWidget(1,
                          'Or press the Textfield below to start typing with the emoji keyboard!'),
                      messageWidget(0,
                          'This is an example message. Long press to do an emoji reaction on this message!'),
                    ],
                  ),
                ),
                Align(
                  alignment: Alignment.bottomCenter,
                  child: EmojiKeyboard(
                    emojiController:
                        emojiReactionIndex == -1 ? controller : null,
                    onEmojiChanged: onActionEmojiChanged,
                    showEmojiKeyboard: showEmojiKeyboard,
                    emojiKeyboardHeight: 440, // optional defaults to 350
                    darkMode: darkMode, // optional defaults to false
                    emojiKeyboardAnimationDuration: const Duration(
                        milliseconds: 400), // optional defaults to null
                  ),
                ),
              ],
            ),
            EmojiKeyboardPopup(
              position: emojiPopupPosition,
              onAction: handleEmojiPopupAction,
              showEmojiPopup: showEmojiPopup,
              darkMode: darkMode, // optional defaults to false
              popupWidth: 350, // optional defaults to 350
              highlightedEmoji: emojiReactionIndex == -1
                  ? null
                  : emojiReactions[
                      emojiReactionIndex], // optional defaults to null
              emojiPopupAnimationDuration: const Duration(
                  milliseconds: 400), // optional defaults to null
            ),
          ],
        ),
      ),
    );
  }
}

See the example directory for the complete sample app.

所屬分類

依賴

依賴清單 3 項

原始碼儲存庫

使用此套件的專案

暫無相關資料。