emoji_extension
Emojis for Flutter & Dart (Unicode 17.0) + one, yet powerful emojis String extension
1.3.0
6.8K downloads/mo
#3462 most downloaded on pub.dev
Nikoro/emoji_extension
What this package is like to depend on
Last release 9 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
1 release in the last 12 months
see the full history below
Release timeline
11 releases · May 2023 to Nov 2025Releases
latest 11-
1.3.026 Nov 2025Release notes
Open source →- Updated emoji dataset to newest Unicode 17.0
- Add new emoji getter methods for improved accessibility
- Upgrade Flutter examples to latest stable version
- Migrate Android build configuration to Kotlin DSL
- Update SDK constraints to ^3.4.0 for all packages
- Refactor emoji data structure and version tracking
- Enhance test coverage for new emoji getters
Release notes
Open source →- Updated emoji dataset to newest Unicode 17.0
- Add new emoji getter methods for improved accessibility
- Upgrade Flutter examples to latest stable version
- Migrate Android build configuration to Kotlin DSL
- Update SDK constraints to ^3.4.0 for all packages
- Refactor emoji data structure and version tracking
- Enhance test coverage for new emoji getters
-
1.2.022 Dec 2024Release notes
Open source →-
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
Release notes
Open source →- Updated emoji dataset to newest Unicode 16.0
- Updated dependencies
- Require Dart
^3.4.0 - Exported emoji regex:
final regex = Emojis.regex; // print(regex); // RegExp: pattern=[#*\d]\uFE0F?\u20E3|[\xA9\... -
-
1.1.119 Apr 2024Release notes
Open source →-
change demo files from *gif to *webp format
-
update CHANGELOG
-
bump version to 1.1.1
-
-
1.1.018 Apr 2024Release notes
Open source →-
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
Release notes
Open source →- Updated dependencies
- Added 2 Flutter example apps:
- Created video tutorial on YouTube
<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>
-
-
1.0.008 Apr 2024Release notes
Open source →-
change Emojis() class API to static -> Generally
Emojis()becomes simplyEmojis(without brackets at the end) -
change
Emojis().gettoEmojis.all: -
remove
any,replaceEach,hasAny,hasEachandeveryOf -
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
Release notes
Open source →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- Introduced new
Emoji()constructor that takes single emoji as parameter
Emoji('🦊') .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- Added new methods and getters:
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; // nullsecond
'👍️te🔴xt👍🏼te👍🏽xt👍🏾te👍🏿xt'.emojis.second // Emoji(value: 🔴, ...)secondOrNull
'👍️te🔴xt👍🏼te👍🏽xt👍🏾te👍🏿xt'.emojis.secondOrNull // Emoji(value: 🔴, ...) 'text'.emojis.secondOrNull; // nullthird
'👍️te🔴xt👍🏼te👍🏽xt👍🏾te👍🏿xt'.emojis.third // Emoji(value: 🔴, ...)thirdOrNull
'👍️te🔴xt👍🏼te👍🏽xt👍🏾te👍🏿xt'.emojis.thirdOrNull // Emoji(value: 🔴, ...) 'text'.emojis.thirdOrNull; // nullfourth
'👍️te👍🏻xt👍🏼te🔴xt👍🏾te👍🏿xt'.emojis.fourth // Emoji(value: 🔴, ...)fourthOrNull
'👍️te👍🏻xt👍🏼te🔴xt👍🏾te👍🏿xt'.emojis.fourthOrNull // Emoji(value: 🔴, ...) 'text'.emojis.fourthOrNull; // nullfifth
'👍️te👍🏻xt👍🏼te👍🏽xt🔴te👍🏿xt'.emojis.fifth // Emoji(value: 🔴, ...)fifthOrNull
'👍️te👍🏻xt👍🏼te👍🏽xt🔴te👍🏿xt'.emojis.fifthOrNull // Emoji(value: 🔴, ...) 'text'.emojis.fifthOrNull; // nullsixth
'👍️te👍🏻xt👍🏼te👍🏽xt👍🏾te🔴xt'.emojis.sixth // Emoji(value: 🔴, ...)sixthOrNull
'👍️te👍🏻xt👍🏼te👍🏽xt👍🏾te🔴xt'.emojis.sixthOrNull // Emoji(value: 🔴, ...) 'text'.emojis.sixthOrNull; // nullpenultimate
'👍️te👍🏻xt👍🏼te👍🏽xt🔴te👍🏿xt'.emojis.penultimate // Emoji(value: 🔴, ...)penultimateOrNull
'👍️te👍🏻xt👍🏼te👍🏽xt🔴te👍🏿xt'.emojis.penultimateOrNull // Emoji(value: 🔴, ...) 'text'.emojis.penultimateOrNull; // nulllast
'👍️te👍🏻xt👍🏼te👍🏽xt👍🏾te🔴xt'.emojis.last // Emoji(value: 🔴, ...)lastOrNull
'👍️te👍🏻xt👍🏼te👍🏽xt👍🏾te🔴xt'.emojis.lastOrNull // Emoji(value: 🔴, ...) 'text'.emojis.lastOrNull; // nullremoveFirst
'🔴te👍🏻xt👍🏼te👍🏽xt👍🏾te👍🏿xt'.emojis.removeFirst; // te👍🏻xt👍🏼te👍🏽xt👍🏾te👍🏿xtremoveSecond
'👍️te🔴xt👍🏼te👍🏽xt👍🏾te👍🏿xt'.emojis.removeSecond; // 👍️text👍🏼te👍🏽xt👍🏾te👍🏿xtremoveThird
'👍️te👍🏻xt🔴te👍🏽xt👍🏾te👍🏿xt'.emojis.removeThird; // 👍️te👍🏻xtte👍🏽xt👍🏾te👍🏿xtremoveFourth
'👍️te👍🏻xt👍🏼te🔴xt👍🏾te👍🏿xt'.emojis.removeFourth; // 👍️te👍🏻xt👍🏼text👍🏾te👍🏿xtremoveFifth
'👍️te👍🏻xt👍🏼te👍🏽xt🔴te👍🏿xt'.emojis.removeFifth; // 👍️te👍🏻xt👍🏼te👍🏽xtte👍🏿xtremoveSixth
'👍️te👍🏻xt👍🏼te👍🏽xt👍🏾te🔴xt'.emojis.removeSixth; // 👍️te👍🏻xt👍🏼te👍🏽xt👍🏾textremovePenultimate
'👍️te👍🏻xt👍🏼te👍🏽xt🔴te👍🏿xt'.emojis.removePenultimate; // 👍️te👍🏻xt👍🏼te👍🏽xtte👍🏿xtremoveLast
'👍️te👍🏻xt👍🏼te👍🏽xt👍🏾te🔴xt'.emojis.removeLast; // 👍️te👍🏻xt👍🏼te👍🏽xt👍🏾textany()
'😀text🤦🏾♀️'.emojis.any((e) => e.value == '😀'); // true '😀text🤦🏾♀️'.emojis.any((e) => e.value == '👍🏻'); // falsecontainsOf()
'😀text🤦🏾♀️'.emojis.containsOf(['😀']); // true '😀text🤦🏾♀️'.emojis.containsOf(['😀', '🤦🏾♀️']); // true '😀text🤦🏾♀️'.emojis.containsOf(['😀', '👍🏻']); // false '😀text🤦🏾♀️'.emojis.containsOf(['👍🏻']); // falsecontainsExactlyOf()
'😀text🤦🏾♀️'.emojis.containsExactlyOf(['😀']); // false '😀text🤦🏾♀️'.emojis.containsExactlyOf(['😀', '🤦🏾♀️']); // true '😀text🤦🏾♀️text😀'.emojis.containsExactlyOf(['😀', '🤦🏾♀️']); // true '😀text🤦🏾♀️'.emojis.containsExactlyOf(['👍🏻']); // falsecontainsOne()
'😀text🤦🏾♀️text😀'.emojis.containsOne((e) => e.value == '🤦🏾♀️'); // true '😀text🤦🏾♀️text😀'.emojis.containsOne((e) => e.value == '👍🏻'); // false '😀text🤦🏾♀️text😀'.emojis.containsOne((e) => e.value == '😀'); // falsecontainsOneOf()
'😀text🤦🏾♀️'.emojis.containsOneOf({'🤦🏾♀️'}); // true '😀text🤦🏾♀️'.emojis.containsOneOf({'😀', '🤦🏾♀️'}); // true '😀text🤦🏾♀️'.emojis.containsOneOf('😀', '🤦🏾♀️', '👍🏻'}); // false '😀text🤦🏾♀️text😀'.emojis.containsOneOf({'😀'}); // falsecontainsExactlyOne()
'😀text'.emojis.containsExactlyOne((e) => e.value == '😀'); // true '😀text🤦🏾♀️'.emojis.containsExactlyOne((e) => e.value == '😀'); // false 'text'.emojis.containsExactlyOne((e) => e.value == '😀'); // falsecontainsExactlyOneOf()
'😀text🤦🏾♀️'.emojis.containsExactlyOneOf({'😀', '🤦🏾♀️'}); // true '😀text🤦🏾♀️text😀'.emojis.containsExactlyOneOf({'😀', '🤦🏾♀️'}); // false '😀text🤦🏾♀️'.emojis.containsExactlyOneOf({'😀'}); // false '😀text🤦🏾♀️'.emojis.containsExactlyOneOf({'😀', '👍🏻'}); // falsecountWhere()
'😀text🤦🏾♀️text😀'.emojis.countWhere((e) => e.value == '😀'); // 2countWhereIndexed()
'😀text🤦🏾♀️text😀'.emojis.countWhereIndexed((i, e) => i == 0 && e.value == '😀'); // 1every()
'😀text😀'.emojis.every((e) => e.value == '😀'); // true '😀text🤦🏾♀️'.emojis.every((e) => e.value == '😀'); // false '😀text🤦🏾♀️'.emojis.every((e) => e.value == '👍🏻'); // falsefirstWhere()
'🤦🏾♀️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 == '👍🏻'); // nullfirstWhereIndexedOrNull()
'🤦🏾♀️text😀text🤦🏻♀️'.emojis.firstWhereIndexedOrNull((i, e) => i == 0 && e.name.contains('Woman')); // Emoji(value: 🤦🏾♀️, ...) '🤦🏾♀️text😀text🤦🏻♀️'.emojis.firstWhereIndexedOrNull((i, e) => i == 0 && e.value == '😀'); // nullfold()
'😀text🤦🏾♀️'.emojis.fold('start', (p, c) => p + c.value); // start😀🤦🏾♀️foldIndexed()
'😀text🤦🏾♀️'.emojis.foldIndexed('start', (i, p ,c) => '$p${c.value}$i'); // start😀0🤦🏾♀️1forEach()
'😀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 == '😀'); // falsenoneOf()
'😀text🤦🏾♀️'.emojis.noneOf(['👍🏻']); // true '😀text🤦🏾♀️'.emojis.noneOf(['👍🏻', '🤦🏾♀️']); // false '😀text🤦🏾♀️'.emojis.noneOf(['😀', '🤦🏾♀️']); // falseremoveAt()
'😀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🤦🏾♀️texttextremoveWhereIndexed()
'😀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 == '👍🏻'); // falsesomeOf()
'😀text🤦🏾♀️'.emojis.someOf(['😀']); // true '😀text🤦🏾♀️'.emojis.someOf(['😀', '👍🏻']); // true '😀text🤦🏾♀️'.emojis.someOf(['👍🏻']); // falsesplitWhere()
'😀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 == '👍🏻'); // nulllastWhereIndexedOrNull()
'🤦🏾♀️text😀text🤦🏻♀️'.emojis.lastWhereIndexedOrNull((i, e) => i == 0 && e.name.contains('Woman')); // Emoji(value: 🤦🏾♀️, ...) '🤦🏾♀️text😀text🤦🏻♀️'.emojis.lastWhereIndexedOrNull((i, e) => i == 0 && e.value == '😀'); // nulltake()
'😀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: 🤦🏻♀️, ...)] -
-
0.3.028 Mar 2024Release notes
Open source →-
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
Release notes
Open source →- Updated emoji dataset to newest Unicode 15.1
- Extended data about emoji including:
- apple name
- also known as
- version
- status
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] )] )- Added
replaceWheremethod:
'😀_text_👍🏻'.emojis.replaceWhere((e) => e.value == '👍🏻' ? 'OK' : null); // 😀_text_OK '😀_text_👍🏻'.emojis.replaceWhere((e) => {'😀':'ABC', '👍🏻':'123'}[e.value]); // ABC_text_123Warning
Deprecated
anygetter -> usecontainsinsteadDeprecated
replaceEachmethod -> usereplaceWithinsteadDeprecated
hasAnymethod -> useanyOfinsteadDeprecated
hasEachmethod -> useeveryOfinstead -
-
0.2.021 Mar 2024Release notes
Open source →-
remove spaces at the the end of test descriptions
-
update README
-
update CHANGELOG
-
bump version to 0.2.0
Release notes
Open source →- Added optional fallback function
onUnknownShortcodewhen parsing String with unknown shortcode:
const text = ':man: :this-shortcode-does-not-exist: :woman:'; final result = text.fromShortcodes(onUnknownShortcode: (_) => '🤷'); print(result); // '👨 🤷 👩'- Added support for parsing chained emojis:
const text = ':otter::woman-facepalming::skin-tone-5::santa::dancer::skin-tone-4::female-astronaut::skin-tone-5:'; final result = text.fromShortcodes(); print(result); // '🦦🤦🏾♀️🎅💃🏽👩🏾🚀'- Improved README
-
-
0.1.304 Feb 2024 -
0.1.204 Feb 2024 -
0.1.110 May 2023Release notes
Open source →- Formatted code
- Updated description
- Updated lint rules
- Improved documentation
- Improved README
-
0.1.009 May 2023