emoji_utils 0.0.1
emoji_utils: ^0.0.1 copied to clipboard
A lightweight Dart utility for accurate single emoji detection. Handles ZWJ sequences, skin tone modifiers, variation selectors, flags, and all modern Unicode emoji ranges.
import 'package:flutter/material.dart';
import 'package:emoji_utils/emoji_utils.dart';
void main() {
runApp(const EmojiUtilsExampleApp());
}
class EmojiUtilsExampleApp extends StatelessWidget {
const EmojiUtilsExampleApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Emoji Utils Example',
debugShowCheckedModeBanner: false,
theme: ThemeData(
colorSchemeSeed: Colors.deepPurple,
useMaterial3: true,
),
home: const ChatScreen(),
);
}
}
class ChatScreen extends StatelessWidget {
const ChatScreen({super.key});
@override
Widget build(BuildContext context) {
// Sample messages to demonstrate emoji detection
final messages = [
'Hello! 👋',
'❤️',
'How are you?',
'😂',
'Great to hear!',
'🎉',
'Good morning 🌅',
'🇹🇷',
'👋🏽',
'See you later!',
];
return Scaffold(
appBar: AppBar(
title: const Text('Emoji Utils Demo'),
centerTitle: true,
),
body: ListView.builder(
padding: const EdgeInsets.all(16),
itemCount: messages.length,
itemBuilder: (context, index) {
final message = messages[index];
final isSingle = EmojiUtils.isSingleEmoji(message);
final isMe = index.isEven;
return _ChatBubble(
message: message,
isSingleEmoji: isSingle,
isMe: isMe,
);
},
),
);
}
}
class _ChatBubble extends StatelessWidget {
const _ChatBubble({
required this.message,
required this.isSingleEmoji,
required this.isMe,
});
final String message;
final bool isSingleEmoji;
final bool isMe;
@override
Widget build(BuildContext context) {
final colorScheme = Theme.of(context).colorScheme;
// If the message is a single emoji, display it large without a bubble
if (isSingleEmoji) {
return Align(
alignment: isMe ? Alignment.centerRight : Alignment.centerLeft,
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 4),
child: Text(
message,
style: const TextStyle(fontSize: 56),
),
),
);
}
// Otherwise, display inside a chat bubble
return Align(
alignment: isMe ? Alignment.centerRight : Alignment.centerLeft,
child: Container(
margin: const EdgeInsets.symmetric(vertical: 4),
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10),
decoration: BoxDecoration(
color: isMe
? colorScheme.primaryContainer
: colorScheme.surfaceContainerHighest,
borderRadius: BorderRadius.circular(20),
),
child: Text(
message,
style: TextStyle(
fontSize: 16,
color: isMe
? colorScheme.onPrimaryContainer
: colorScheme.onSurface,
),
),
),
);
}
}