๐งฐ Flutter Extension Utils
Extensions that just make sense.
A handy collection of Dart and Flutter extension methods to supercharge your development experience โ clean syntax, reusable logic, and expressive code, all in one lightweight package.
Designed to save you time, reduce boilerplate, and improve readability across widgets, strings, numbers, booleans, and BuildContext.
๐ Installation & Setup
The package can be installed using the command
flutter pub add flutter_utils_extensions
And can then be imported using
import 'package:flutter_utils_extensions/flutter_utils_extensions.dart';
๐ Features
๐งฑ BuildContext Extensions
-
formโ Easily access the nearestFormStateusingcontext.form. -
navigatorโ Shorthand forNavigator.of(context). -
overlayโ Access the currentOverlayStatefrom the context. -
scaffoldโ Retrieve the nearestScaffoldStatewithcontext.scaffold.
ScaffoldMessenger
-
scaffoldMessengerโ Quickly get theScaffoldMessengerStatefor showing snackbars and more. -
void showSnackBar(String content, {Duration? duration, SnackBarBehavior behavior = SnackBarBehavior.fixed})- Quickly show a SnackBar without manually accessing ScaffoldMessenger.
Media Query
-
mediaQueryโ AccessMediaQueryDatafrom context. -
platformBrightnessโ Get the system's brightness setting (Brightness.darkorBrightness.light). -
platformInDarkModeโ Returnstrueif the app is currently in dark mode. -
widgetSizeโ Get the rendered size of the widget associated with the context. -
widgetHeightโ Convenience getter for just the height of the widget. -
widgetWidthโ Convenience getter for just the width.
Media Query Orientation
-
orientationโ Access the current screen orientation (portraitorlandscape). -
isLandscape/isPortraitโ Easy checks for current orientation. -
widgetShortestSideโ Useful for responsive layouts based on the device's shortest screen edge. -
isPhoneโ Returnstrueif the device is considered a phone. -
isSmallTablet,isLargeTabletโ Classify tablets based on width. -
isTabletโ Shortcut combining both small and large tablets. -
isDesktopโ Detects larger screens, typically desktops.
๐๏ธ DateTime Extensions
โ Checkers
-
isAfternoon()โ Checks if the time is between 12:00 PM and 5:59 PM. -
isMorning()โ Checks if the time is before 12:00 PM. -
isEvening()โ Checks if the time is between 6:00 PM and 8:59 PM. -
isNight()โ Checks if the time is after 9:00 PM. -
isToday()/isTomorrow()/isYesterday()โ Quickly check the relation to the current day. -
isSameDay(DateTime other)โ Returnstrueif the date is the same calendar day asother. -
isInPast()/isInFuture()โ Check if the datetime is before or after now. -
isExpired()โ A semantic shortcut forisInPast(). -
isAgeOlder(age)/isAgeYounger(age)/isAgeEqualTo(age)โ Check against an age. -
isAgeBetween(min, max)โ Check if the age is within a given range.
๐ง Manipulators
-
addDays(int)/addMonths(int)/addYears(int)โ Add to the datetime. -
addHours(int)/addMinutes(int)/addSeconds(int)โ Add smaller units. -
subDays(int)/subMonths(int)/subYears(int)โ Subtract from the datetime. -
subHours(int)/subMinutes(int)/subSeconds(int)โ Subtract smaller units.
๐ง Time to String
-
toAge()โ Convert the date to an age in years. -
toDateString({String format = "yyyy-MM-d"})โ Format as a custom date string. -
toDateStringUK()โ Format in British style (dd/MM/yyyy). -
toDateStringUS()โ Format in US style (MM/dd/yyyy). -
toDateTimeString()โ Full readable datetime string. -
toFormat(String format)โ Fully custom format usingintl. -
toTimeAgoString()โ Human-readable "time ago" format (e.g. "2 days ago"). -
toTimeString()โ Convert to time only (e.g.14:35or14:35:59). -
toShortDate()โ Returns a short formatted date string (e.g.Apr 25, 2025). -
toDayOrdinal()โ Get the day of the month with ordinal (e.g.1st,22nd,31st).
โณ Duration Extensions
delay([callback])โ Delays execution for the given duration. Optionally accepts a callback to run after the delay.
// Example
await 2.seconds.delay(() {
print('Delayed by 2 seconds');
});
๐ Dynamic Extensions
-
nullOnDebug<T>()โ Returnsnullonly in debug mode; retains value in release/profile. Useful for testing nullable flows. -
onlyOnDebug<T>()โ Returns the value only in debug mode, otherwisenull. -
maybe<T>({double probability = 0.5})โ Randomly returnsnullbased on the given probability (between 0.0 and 1.0). Great for simulating unreliable data in tests or dev mode.
final value = 'Simulate me'.maybe(probability: 0.3);
// Has a 30% chance of being null
๐ผ๏ธ Image Extensions
circleAvatar({ ... })โ Quickly convert anImageProviderto aCircleAvatarwidget with full customisation options.
// Example
NetworkImage('https://example.com/pic.jpg').circleAvatar(radius: 40);
Parameters:
- backgroundColor โ Background colour of the avatar (default is transparent).
- radius โ Sets the circular radius of the avatar.
- minRadius / maxRadius โ Optional constraints.
- foregroundColor โ Colour for the foreground image.
- onBackgroundImageError / onForegroundImageError โ Handle image load failures.
๐ข Number Extensions
๐งฎ General Num Extensions
-
isEqual(otherNum)โ Checks if two numbers are exactly equal. -
isGreaterThan(otherNum)โ Returnstrueif the number is greater. -
isLessThan(otherNum)โ Returnstrueif the number is less. -
clampMin(min)โ Clamps the number to a minimum value. -
clampMax(max)โ Clamps the number to a maximum value.
๐ฒ Random Generators
-
randomLess({min = 1.0})โ Forintordouble, generates a random value less than the current one, starting from themin. -
randomMore(max)โ Generates a random value greater than the current one, up tomax.
10.randomLess(); // e.g. returns 3, 7, etc.
5.5.randomMore(10.0); // e.g. returns 6.23, etc.
๐ฐ Number Formatting
-
formatAsCurrency({locale, symbol, decimalDigits})โ Formats the number as currency. -
formatAsDecimal({locale, decimalDigits})โ Formats the number as a decimal with specified precision. -
formatAsNumber({locale})โ Formats as a regular number string.
1234.5.formatAsCurrency(locale: 'en_NG', symbol: 'โฆ'); // โฆ1,234.50
โฑ๏ธ Number to Duration
days,hours,minutes,seconds,milliseconds,microsecondsโ Shorthand for converting numbers to Duration.
// Example
await 2.seconds.delay(); // Waits for 2 seconds
๐ค String Extensions
โ Utilities
-
matchesRegExp(regex)โ Checks if the string matches a given regular expression. -
toBoolโ Converts"true"or"false"to a boolean. -
toDateTime()โ Parses the string into aDateTimeobject. -
toRegExp()โ Converts the string into aRegExp. -
limit(maxLength, [overflow = "โฆ"])โ Limits string length with optional overflow characters. -
mask({start = 2, end = 2, maskChar = '*', maskLength})โ Masks the middle of the string, leaving edges visible.
'08012345678'.mask(); // 08*******78
'08012345678'.mask(maskLength: 2); // 08**78
๐ Pretty Printing
-
prettyJson()โ Formats a raw JSON string. -
prettyXml()โ Formats raw XML into readable indents. -
prettyYaml()โ Formats YAML strings prettily.
๐ Casing
-
camelCaseโ Converts string to camelCase. -
capitalisedโ Capitalises the first letter of each word. -
kebabCaseโ Converts string to kebab-case. -
pascalCaseโ Converts string to PascalCase. -
snakeCaseโ Converts string to snake_case. -
titleCaseโ Converts string to Title Case.
'the big brown fox'.camelCase; // theBigBrownFox
'the big brown fox'.capitalised; // The big brown fox
'the big brown fox'.pascalCase; // TheBigBrownFox
'the big brown fox'.kebabCase; // the-big-brown-fox
'the big brown fox'.snakeCase; // the_-_big_-_brown_-_fox
'the big brown fox'.titleCase; // The Big Brown Fox
๐งช Case and Pattern Checkers
Case Checkers
-
isCamelCase -
isPascalCase -
isSnakeCase -
isKebabCase -
isTitleCase -
isCapitalised -
isUpperCase -
isLowerCase
Pattern Checkers
-
isEmail -
isURL -
isUlid -
isUuid -
isSlug -
isHexColor -
isIPAddress -
isNum โ Validates numeric string -
isAlphabetOnly -
isNumericOnly
๐งฉ Widget Extensions
๐ช Basic Transformations
-
center({heightFactor, widthFactor})โ Wraps widget in aCenter. -
expanded([flex = 1])โ Wraps widget in anExpanded. -
flexible({flex = 1, fit = FlexFit.loose})โ Wraps widget in aFlexible. -
opacity(opacity)โ Wraps widget with anOpacitywidget. -
sizedBox({width, height})โ Wraps widget with aSizedBox. -
constrained({maxHeight, maxWidth, minHeight, minWidth})โ Wraps widget with aConstrainedBox.
โ๏ธ Clipping
-
clipRect()โ Clips widget to a rectangle. -
clipRRect(borderRadius)โ Clips widget with rounded corners. -
clipRounded([radius = 12])โ Quickly clip widget with a uniform rounded border.
๐งน Padding
-
paddingAll(padding)โ Adds equal padding on all sides. -
paddingSymmetric({horizontal, vertical})โ Adds symmetric horizontal and vertical padding. -
paddingOnly({left, top, right, bottom})โ Custom padding for specific sides. -
paddingZero()โ Adds zero padding.
๐งญ Positioning
-
positionAlign(alignment)โ Aligns widget usingAlign. -
positionedFill()โ Fills parent constraints usingPositioned.fill.
๐ป Visibility Helpers
-
hideIf(condition)โ Hides widget (returnsSizedBox.shrink()) ifconditionis true. -
hideUnless(condition)โ Hides widget unlessconditionis true. -
showIf(condition)โ Shows widget ifconditionis true, otherwise hides. -
showUnless(condition)โ Shows widget unlessconditionis true.
๐ inkwellManager on Widget
A helper class for managing taps on a widget in a cleaner way.
-
inkWellManager(callback, {color = Colors.transparent})โ Wraps widget with anInkWellfor tap detection. -
onTap()โ Wraps child withInkWellfor tap gesture. -
onDoubleTap()โ Wraps child withInkWellfor double-tap gesture. -
onLongPress()โ Wraps child withInkWellfor long-press gesture.
Tip: Used alongside the
inkWellManagerextension to easily attach tap interactions without boilerplate.
Text('Click Me')
.inkWellManager(() => print('Tapped'), color: Colors.black)
.onTap();
๐ก Why InkWellManager?
Normally, to make a widget respond to taps, you must manually wrap it inside an InkWell every time, setting colours and callbacks.
InkWellManager simplifies this by providing quick .onTap(), .onDoubleTap(), and .onLongPress() methods โ making your code shorter, cleaner, and more maintainable.
It also auto-applies the same splash, hover, and focus colours without extra setup.
Usage
To use, simply import the package into your project and you can then all of the extensions it provdes ๐ซถ๐พ
import 'package:flutter_utils_extensions/flutter_utils_extensions.dart';
๐ข Additional Information
๐ค Contributing
Contributions are highly welcome! If you have ideas for new extensions, improvements, or fixes, feel free to fork the repository and submit a pull request.
Please make sure to:
- Follow the existing coding style.
- Write tests for new features.
- Update documentation if necessary.
Let's build something amazing together!
๐ Reporting Issues
If you encounter a bug, unexpected behaviour, or have feature requests:
- Open an issue on the repository.
- Provide a clear description and steps to reproduce (if it's a bug).
- Suggest improvements if you have any ideas.
Your feedback helps make the package better for everyone!
๐ Licence
This package is licensed under the MIT License โ which means you are free to use it for commercial and non-commercial projects, with proper attribution.
See the LICENSE file for more details.
๐ Support
If you find this package helpful, please consider giving it a โญ๏ธ on GitHub โ it motivates and helps the project grow!
You can also support by:
- Sharing the package with your friends, colleagues, and tech communities.
- Using it in your projects and giving feedback.
- Contributing new ideas, features, or improvements.
Every little bit of support counts! ๐๐