flutter_utils_extensions 0.0.2
flutter_utils_extensions: ^0.0.2 copied to clipboard
A comprehensive set of handy Dart and Flutter extensions to make your code cleaner, shorter, and more expressive.
๐งฐ 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! ๐๐