NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #4933 most downloaded on pub.dev
Emojis for Flutter & Dart (Unicode 17.0) + one, yet powerful emojis String extension
Last release 10 months ago
26 Nov 2025
Release timing varies
gaps range from 9 days to 11 months
Nearly every release is documented
notes for 11 of 11 stable releases
Nothing withdrawn
no release was ever pulled
3 years old
11 releases · first in 2023
One column per quarter.
Updated emoji dataset to newest Unicode 17.0
update dependencies, export emojis regex
update dependencies, export emojis regex
update emoji data to version 16.0
add tests for regexes
bump version to 1.2.0
fix flutter examples
update CHANGELOG
^3.4.0final regex = Emojis.regex;
// print(regex); // RegExp: pattern=[#*\d]\uFE0F?\u20E3|[\xA9\...
change demo files from *gif to *webp format
change demo files from *gif to *webp format
update CHANGELOG
bump version to 1.1.1
update dependencies update README add youtube tutorial add emoji overview app example add emoji chat app example update CHANGELOG bump version to 1.1.
update dependencies
update README
add youtube tutorial
add emoji overview app example
add emoji chat app example
update CHANGELOG
bump version to 1.1.0
<p align="center"> <a href="https://youtu.be/fLPVkksEpJw"><img src="https://raw.githubusercontent.com/nikoro/emoji_extension/develop/images/youtube.webp" width="600"/></a> </p>
change Emojis() class API to static -> Generally Emojis() becomes simply Emojis (without brackets at the end)
change Emojis() class API to static -> Generally Emojis() becomes simply Emojis (without brackets at the end)
change Emojis().get to Emojis.all:
remove any, replaceEach, hasAny, hasEach and everyOf
introduce new Emoji() constructor that takes single emoji as parameter
add shortcut methods and getters from package collection
export package collection
add topics and small logo
update CHANGELOG
update README
bump version to 1.0.0
BREAKING CHANGES:
Changed
Emojis()class API to staticGenerally
Emojis()becomes simplyEmojis(without brackets at the end):
/*Old*/ Emojis() /*New*/ Emojis
/*Old*/ Emojis().smileysAndEmotion /*New*/ Emojis.smileysAndEmotion
/*Old*/ Emojis().groups /*New*/ Emojis.groups
/*Old*/ Emojis().getOne() /*New*/ Emojis.getOne()
// etc...
Changed
Emojis().gettoEmojis.all:
/*Old*/ Emojis().get /*New*/ Emojis.all
/*Old*/ Emojis().get.values /*New*/ Emojis.all.values
/*Old*/ Emojis().get.names /*New*/ Emojis.all.names
// etc...
Removed
anygetter -> usecontainsinsteadRemoved
replaceEachmethod -> usereplaceWithinsteadRemoved
hasAnymethod -> useanyOfinsteadRemoved
hasEachmethod -> usecontainsOfinsteadRemoved
everyOfmethod -> usecontainsOfinstead
Emoji() constructor that takes single emoji as parameterEmoji('🦊')
.name // Fox
.appleName // Fox Face
.unicode // 1F98A
.shortcode // :fox:
.discordShortcode // :fox:
.discordShortcodes // [:fox:, :fox_face:]
.first // :fox:
.second // :fox_face:
.version // Version.v9_0
.value // 9.0
.isAnimal // true
.isFlag // false
.isFlower // false
.isFruit // false
.isGeometric // false
.isMan // false
.isWoman // false
.isVegetable // false
.isPerson // false
.isMultiPerson // false
.isSymbol // false
.isV9_0 // true
.hasBeard // false
.hasFace // true
.hasHairStyle // false
.hasSkinTone // false
.hasColor // false
.color // null
.skinTone // null
.hairStyle // null
first
'🔴te👍🏻xt👍🏼te👍🏽xt👍🏾te👍🏿xt'.emojis.first // Emoji(value: 🔴, ...)
firstOrNull
'🔴te👍🏻xt👍🏼te👍🏽xt👍🏾te👍🏿xt'.emojis.firstOrNull // Emoji(value: 🔴, ...)
'text'.emojis.firstOrNull; // null
second
'👍️te🔴xt👍🏼te👍🏽xt👍🏾te👍🏿xt'.emojis.second // Emoji(value: 🔴, ...)
secondOrNull
'👍️te🔴xt👍🏼te👍🏽xt👍🏾te👍🏿xt'.emojis.secondOrNull // Emoji(value: 🔴, ...)
'text'.emojis.secondOrNull; // null
third
'👍️te🔴xt👍🏼te👍🏽xt👍🏾te👍🏿xt'.emojis.third // Emoji(value: 🔴, ...)
thirdOrNull
'👍️te🔴xt👍🏼te👍🏽xt👍🏾te👍🏿xt'.emojis.thirdOrNull // Emoji(value: 🔴, ...)
'text'.emojis.thirdOrNull; // null
fourth
'👍️te👍🏻xt👍🏼te🔴xt👍🏾te👍🏿xt'.emojis.fourth // Emoji(value: 🔴, ...)
fourthOrNull
'👍️te👍🏻xt👍🏼te🔴xt👍🏾te👍🏿xt'.emojis.fourthOrNull // Emoji(value: 🔴, ...)
'text'.emojis.fourthOrNull; // null
fifth
'👍️te👍🏻xt👍🏼te👍🏽xt🔴te👍🏿xt'.emojis.fifth // Emoji(value: 🔴, ...)
fifthOrNull
'👍️te👍🏻xt👍🏼te👍🏽xt🔴te👍🏿xt'.emojis.fifthOrNull // Emoji(value: 🔴, ...)
'text'.emojis.fifthOrNull; // null
sixth
'👍️te👍🏻xt👍🏼te👍🏽xt👍🏾te🔴xt'.emojis.sixth // Emoji(value: 🔴, ...)
sixthOrNull
'👍️te👍🏻xt👍🏼te👍🏽xt👍🏾te🔴xt'.emojis.sixthOrNull // Emoji(value: 🔴, ...)
'text'.emojis.sixthOrNull; // null
penultimate
'👍️te👍🏻xt👍🏼te👍🏽xt🔴te👍🏿xt'.emojis.penultimate // Emoji(value: 🔴, ...)
penultimateOrNull
'👍️te👍🏻xt👍🏼te👍🏽xt🔴te👍🏿xt'.emojis.penultimateOrNull // Emoji(value: 🔴, ...)
'text'.emojis.penultimateOrNull; // null
last
'👍️te👍🏻xt👍🏼te👍🏽xt👍🏾te🔴xt'.emojis.last // Emoji(value: 🔴, ...)
lastOrNull
'👍️te👍🏻xt👍🏼te👍🏽xt👍🏾te🔴xt'.emojis.lastOrNull // Emoji(value: 🔴, ...)
'text'.emojis.lastOrNull; // null
removeFirst
'🔴te👍🏻xt👍🏼te👍🏽xt👍🏾te👍🏿xt'.emojis.removeFirst; // te👍🏻xt👍🏼te👍🏽xt👍🏾te👍🏿xt
removeSecond
'👍️te🔴xt👍🏼te👍🏽xt👍🏾te👍🏿xt'.emojis.removeSecond; // 👍️text👍🏼te👍🏽xt👍🏾te👍🏿xt
removeThird
'👍️te👍🏻xt🔴te👍🏽xt👍🏾te👍🏿xt'.emojis.removeThird; // 👍️te👍🏻xtte👍🏽xt👍🏾te👍🏿xt
removeFourth
'👍️te👍🏻xt👍🏼te🔴xt👍🏾te👍🏿xt'.emojis.removeFourth; // 👍️te👍🏻xt👍🏼text👍🏾te👍🏿xt
removeFifth
'👍️te👍🏻xt👍🏼te👍🏽xt🔴te👍🏿xt'.emojis.removeFifth; // 👍️te👍🏻xt👍🏼te👍🏽xtte👍🏿xt
removeSixth
'👍️te👍🏻xt👍🏼te👍🏽xt👍🏾te🔴xt'.emojis.removeSixth; // 👍️te👍🏻xt👍🏼te👍🏽xt👍🏾text
removePenultimate
'👍️te👍🏻xt👍🏼te👍🏽xt🔴te👍🏿xt'.emojis.removePenultimate; // 👍️te👍🏻xt👍🏼te👍🏽xtte👍🏿xt
removeLast
'👍️te👍🏻xt👍🏼te👍🏽xt👍🏾te🔴xt'.emojis.removeLast; // 👍️te👍🏻xt👍🏼te👍🏽xt👍🏾text
any()
'😀text🤦🏾♀️'.emojis.any((e) => e.value == '😀'); // true
'😀text🤦🏾♀️'.emojis.any((e) => e.value == '👍🏻'); // false
containsOf()
'😀text🤦🏾♀️'.emojis.containsOf(['😀']); // true
'😀text🤦🏾♀️'.emojis.containsOf(['😀', '🤦🏾♀️']); // true
'😀text🤦🏾♀️'.emojis.containsOf(['😀', '👍🏻']); // false
'😀text🤦🏾♀️'.emojis.containsOf(['👍🏻']); // false
containsExactlyOf()
'😀text🤦🏾♀️'.emojis.containsExactlyOf(['😀']); // false
'😀text🤦🏾♀️'.emojis.containsExactlyOf(['😀', '🤦🏾♀️']); // true
'😀text🤦🏾♀️text😀'.emojis.containsExactlyOf(['😀', '🤦🏾♀️']); // true
'😀text🤦🏾♀️'.emojis.containsExactlyOf(['👍🏻']); // false
containsOne()
'😀text🤦🏾♀️text😀'.emojis.containsOne((e) => e.value == '🤦🏾♀️'); // true
'😀text🤦🏾♀️text😀'.emojis.containsOne((e) => e.value == '👍🏻'); // false
'😀text🤦🏾♀️text😀'.emojis.containsOne((e) => e.value == '😀'); // false
containsOneOf()
'😀text🤦🏾♀️'.emojis.containsOneOf({'🤦🏾♀️'}); // true
'😀text🤦🏾♀️'.emojis.containsOneOf({'😀', '🤦🏾♀️'}); // true
'😀text🤦🏾♀️'.emojis.containsOneOf('😀', '🤦🏾♀️', '👍🏻'}); // false
'😀text🤦🏾♀️text😀'.emojis.containsOneOf({'😀'}); // false
containsExactlyOne()
'😀text'.emojis.containsExactlyOne((e) => e.value == '😀'); // true
'😀text🤦🏾♀️'.emojis.containsExactlyOne((e) => e.value == '😀'); // false
'text'.emojis.containsExactlyOne((e) => e.value == '😀'); // false
containsExactlyOneOf()
'😀text🤦🏾♀️'.emojis.containsExactlyOneOf({'😀', '🤦🏾♀️'}); // true
'😀text🤦🏾♀️text😀'.emojis.containsExactlyOneOf({'😀', '🤦🏾♀️'}); // false
'😀text🤦🏾♀️'.emojis.containsExactlyOneOf({'😀'}); // false
'😀text🤦🏾♀️'.emojis.containsExactlyOneOf({'😀', '👍🏻'}); // false
countWhere()
'😀text🤦🏾♀️text😀'.emojis.countWhere((e) => e.value == '😀'); // 2
countWhereIndexed()
'😀text🤦🏾♀️text😀'.emojis.countWhereIndexed((i, e) => i == 0 && e.value == '😀'); // 1
every()
'😀text😀'.emojis.every((e) => e.value == '😀'); // true
'😀text🤦🏾♀️'.emojis.every((e) => e.value == '😀'); // false
'😀text🤦🏾♀️'.emojis.every((e) => e.value == '👍🏻'); // false
firstWhere()
'🤦🏾♀️text😀text🤦🏻♀️'.emojis.firstWhere((e) => e.name.contains('Woman')); // Emoji(value: 🤦🏾♀️, ...)
firstWhereIndexed()
'🤦🏾♀️text😀text🤦🏻♀️'.emojis.firstWhereIndexed((i, e) => i > 0 && e.name.contains('Woman')); // Emoji(value: 🤦🏻♀️, ...)
firstWhereOrNull()
'🤦🏾♀️text😀text🤦🏻♀️'.emojis.firstWhereOrNull((e) => e.name.contains('Woman')); // Emoji(value: 🤦🏾♀️, ...)
'🤦🏾♀️text😀text🤦🏻♀️'.emojis.firstWhereOrNull((e) => e.value == '👍🏻'); // null
firstWhereIndexedOrNull()
'🤦🏾♀️text😀text🤦🏻♀️'.emojis.firstWhereIndexedOrNull((i, e) => i == 0 && e.name.contains('Woman')); // Emoji(value: 🤦🏾♀️, ...)
'🤦🏾♀️text😀text🤦🏻♀️'.emojis.firstWhereIndexedOrNull((i, e) => i == 0 && e.value == '😀'); // null
fold()
'😀text🤦🏾♀️'.emojis.fold('start', (p, c) => p + c.value); // start😀🤦🏾♀️
foldIndexed()
'😀text🤦🏾♀️'.emojis.foldIndexed('start', (i, p ,c) => '$p${c.value}$i'); // start😀0🤦🏾♀️1
forEach()
'😀text🤦🏾♀️'.emojis.forEach((e) => print(e.value)); // 😀 🤦🏾♀️
forEachIndexed()
'😀text🤦🏾♀️'.emojis.forEachIndexed(i,e) => print('$i:${e.value}')); // 0:😀 1:🤦🏾♀️
forEachWhile()
'😀text🤦🏾♀️text😀'.emojis.forEachWhile((e) {
print(e.value);
return e.value == '😀';
}); // 😀 🤦🏾♀️
forEachIndexedWhile()
'😀text🤦🏾♀️text😀'.emojis.forEachIndexedWhile((i, e) {
print('$i:${e.value}');
return e.value == '😀';
}); // 0:😀 1:🤦🏾♀️
join()
'😀text🤦🏾♀️'.emojis.join((e) => e.value,
separator: '.',
prefix: 'prefix',
suffix: 'suffix'); // 'prefix😀.🤦🏾♀️suffix'
map()
'😀text🤦🏾♀️'.emojis.map((e) => 'Emoji: ${e.name}'); // [Emoji: Grinning Face, Emoji: Woman Facepalming: Medium-Dark Skin Tone]
mapIndexed()
'😀text🤦🏾♀️'.emojis.mapIndexed((i, e) => '$i: ${e.name}'); // [0: Grinning Face, 1: Woman Facepalming: Medium-Dark Skin Tone]
none()
'😀text🤦🏾♀️'.emojis.none((e) => e.value == '👍🏻'); // true
'😀text🤦🏾♀️'.emojis.none((e) => e.value == '😀'); // false
noneOf()
'😀text🤦🏾♀️'.emojis.noneOf(['👍🏻']); // true
'😀text🤦🏾♀️'.emojis.noneOf(['👍🏻', '🤦🏾♀️']); // false
'😀text🤦🏾♀️'.emojis.noneOf(['😀', '🤦🏾♀️']); // false
removeAt()
'😀text🤦🏾♀️'.emojis.removeAt(0); // text🤦🏾♀️
'😀text🤦🏾♀️'.emojis.removeAt(10); // 😀text🤦🏾♀️
removeFromEnd()
'😀text🤦🏾♀️'.emojis.removeFromEnd(0); // 😀text
'😀text🤦🏾♀️'.emojis.removeFromEnd(10); // 😀text🤦🏾♀️
removeEveryOf()
'😀text🤦🏾♀️text👍🏻text😀'.emojis.removeEveryOf(['😀', '👍🏻']); // text🤦🏾♀️texttext
removeWhereIndexed()
'😀text🤦🏾♀️text😀'.emojis.removeWhereIndexed((i, e) => i == 0 && e.value == '😀'); // text🤦🏾♀️text😀
replaceWhereIndexed()
'😀text🤦🏾♀️text😀'.emojis.replaceWhereIndexed((i, e) => i == 1 ? '_123_' : null); // 😀text_123_text😀
skip()
'😀text🤦🏾♀️text👍🏻'.emojis.skip(1); // [Emoji(value: 🤦🏾♀️, ...), Emoji(value: 👍🏻, ...)]
skipLast()
'😀text🤦🏾♀️text👍🏻'.emojis.skipLast(1); // [Emoji(value: 😀, ...), Emoji(value: 🤦🏾♀️, ...)]
skipWhile()
'😀text🤦🏾♀️text👍🏻'.emojis.skipWhile((e) => e.value == '😀'); // [Emoji(value: 🤦🏾♀️, ...), Emoji(value: 👍🏻, ...)]
some()
'😀text🤦🏾♀️'.emojis.some((e) => e.value == '😀'); // true
'😀text🤦🏾♀️'.emojis.some((e) => e.value == '👍🏻'); // false
someOf()
'😀text🤦🏾♀️'.emojis.someOf(['😀']); // true
'😀text🤦🏾♀️'.emojis.someOf(['😀', '👍🏻']); // true
'😀text🤦🏾♀️'.emojis.someOf(['👍🏻']); // false
splitWhere()
'😀text🤦🏾♀️text😀'.emojis.splitWhere((e) => e.value == '🤦🏾♀️'); // [😀text, text😀]
splitWhereIndexed()
'😀text🤦🏾♀️text😀'.emojis.splitWhereIndexed((i, e) => i == 1 && e.value == '🤦🏾♀️'); // [😀text, text😀]
lastWhere()
'🤦🏾♀️text😀text🤦🏻♀️'.emojis.lastWhere((e) => e.name.contains('Woman')); // Emoji(value: 🤦🏻♀️, ...)
lastWhereIndexed()
'🤦🏾♀️text😀text🤦🏻♀️'.emojis.lastWhereIndexed((i, e) => i == 0 && e.name.contains('Woman')); // Emoji(value: 🤦🏾♀️, ...)
lastWhereOrNull()
'🤦🏾♀️text😀text🤦🏻♀️'.emojis.lastWhereOrNull((e) => e.name.contains('Woman')); // Emoji(value: 🤦🏻♀️, ...)
'🤦🏾♀️text😀text🤦🏻♀️'.emojis.lastWhereOrNull((e) => e.value == '👍🏻'); // null
lastWhereIndexedOrNull()
'🤦🏾♀️text😀text🤦🏻♀️'.emojis.lastWhereIndexedOrNull((i, e) => i == 0 && e.name.contains('Woman')); // Emoji(value: 🤦🏾♀️, ...)
'🤦🏾♀️text😀text🤦🏻♀️'.emojis.lastWhereIndexedOrNull((i, e) => i == 0 && e.value == '😀'); // null
take()
'😀text🤦🏾♀️text👍🏻'.emojis.take(2); // [Emoji(value: 😀, ...), Emoji(value: 🤦🏾♀️, ...)]
takeLast()
'😀text🤦🏾♀️text👍🏻'.emojis.takeLast(2); // [Emoji(value: 🤦🏾♀️, ...), Emoji(value: 👍🏻, ...)]
takeWhile()
'😀text🤦🏾♀️text👍🏻'.emojis.takeWhile((e) => e.value == '😀'); // [Emoji(value: 😀, ...)]
where()
'🤦🏾♀️text😀text🤦🏻♀️'.emojis.where((e) => e.name.contains('Woman')); // [Emoji(value: 🤦🏾♀️, ...), Emoji(value: 🤦🏻♀️, ...)]
whereIndexed()
'🤦🏾♀️text😀text🤦🏻♀️'.emojis.whereIndexed((i, e) => i == 0 && e.name.contains('Woman')); // [Emoji(value: 🤦🏾♀️, ...)]
whereNot()
'🤦🏾♀️text😀text🤦🏻♀️'.emojis.whereNot((e) => e.name.contains('Woman')); // [Emoji(value: 😀, ...)]
whereNotIndexed()
'🤦🏾♀️text😀text🤦🏻♀️'.emojis.whereNotIndexed((i, e) => i == 0 && e.name.contains('Woman')); // [Emoji(value: 😀, ...), Emoji(value: 🤦🏻♀️, ...)]
update emoji data to unicode 15.1
update emoji data to unicode 15.1
add unicode versions and emoji statuses
add parameter apple name to emoji object
add parameter alsoKnownAs to emoji object
change emoji data source to pure dart instead of json
add copyWith method to Emoji & Shortcode classes, add tests, update README
add additional ordinal numbers iterable extensions
add appleNames & alsoKnownAs getters
add replaceWhere method
update dependencies
update README
rename removeEach to removeWhere,
rename any to contains
rename hasAny to anyOf and hasEach to everyOf
Example:
Emoji(
value: 😆,
unicode: 1F606,
name: Grinning Squinting Face,
appleName: Grinning Face with Squinting Eyes,
alsoKnownAs: [><, Closed-Eyes Smile, Big Grin, Laughing, XD],
group: Smileys & Emotion,
subgroup: face-smiling,
version: 6.0,
status: fully-qualified,
shortcodes: [
Shortcode(
platform: Default,
values: [grinning_squinting_face]
),
Shortcode(
platform: CLDR,
values: [grinning_squinting_face]
),
Shortcode(
platform: Discord,
values: [laughing, satisfied]
),
Shortcode(
platform: Github,
values: [laughing, satisfied]
),
Shortcode(
platform: Slack,
values: [laughing, satisfied]
)]
)
replaceWhere method:'😀_text_👍🏻'.emojis.replaceWhere((e) => e.value == '👍🏻' ? 'OK' : null); // 😀_text_OK
'😀_text_👍🏻'.emojis.replaceWhere((e) => {'😀':'ABC', '👍🏻':'123'}[e.value]); // ABC_text_123
Warning
Deprecated
anygetter -> usecontainsinsteadDeprecated
replaceEachmethod -> usereplaceWithinsteadDeprecated
hasAnymethod -> useanyOfinsteadDeprecated
hasEachmethod -> useeveryOfinstead
remove spaces at the the end of test descriptions
remove spaces at the the end of test descriptions
update README
update CHANGELOG
bump version to 0.2.0
onUnknownShortcode when parsing String with unknown shortcode:const text = ':man: :this-shortcode-does-not-exist: :woman:';
final result = text.fromShortcodes(onUnknownShortcode: (_) => '🤷');
print(result); // '👨 🤷 👩'
const text = ':otter::woman-facepalming::skin-tone-5::santa::dancer::skin-tone-4::female-astronaut::skin-tone-5:';
final result = text.fromShortcodes();
print(result); // '🦦🤦🏾♀️🎅💃🏽👩🏾🚀'
update description update README update CHANGELOG bump version to 0.1.3
update description
update README
update CHANGELOG
bump version to 0.1.3
Updated the SDK constraint to '>=2.18.6 <4.0.0'
- Formatted code - Updated description - Updated lint rules - Improved documentation - Improved README
Initial release 🎉
Initial release 🎉
Your coding agent can read these notes before it upgrades. Set up the MCP server →