Important Notes for Version 4.1.0+: We've refactored the Dart-specific utilities into a new package, dart_helper_utils
, to allow Dart projects to use these utilities without depending on Flutter.
- Future updates for Dart-specific utilities will be available in the
dart_helper_utils
changelog. - All the Dart-specific utilities documentation has been moved to the
dart_helper_utils
readme. - This package already exports
dart_helper_utils
, so there are no breaking changes in this version.
Table of Contents
Featured
ValueNotifier Supercharged
ValueNotifier is a simple class in Flutter that allows you to store a value and notify any listeners when the value changes.
This package enhances ValueNotifier
with additional functionalities:
Starting from version 4.0.0, you can use a new set of extensions, helper methods, and specialized notifiers for better data handling:
- Instantly create notifiers from any value with the intuitive
.notifier
extension (e.g.,10.notifier
). - Specific data types using our type-safe notifiers like
ListNotifier
,BoolNotifier
,IntNotifier
, etc. - Use the
.builder
extension on anyValueListenable
,Listenable
, orList<Listenable>
instance to create aValueListenableBuilder
,ListenableBuilder
, orListenablesBuilder
respectively under the hood with a shorter and simpler syntax. - Complex data handling with collections. For example,
ListNotifier
, which acts like a normal list andValueNotifier
at the same time, allowing usage infor
loops, inValueListenableBuilder
widgets, and automatic notifications when inner data changes (same goes for all notifier classes!).
Example:
final counter = 0.notifier;
counter.listenableBuilder((count) => Text('$count'));
counter.increment(); // Increment the counter easily
For more info about ValueNotifier
,
check the official Flutter documentation.
PlatformEnv class
A replacement for the dart:io
Platform
class.
Key enhancements over the original Platform
:
- Eliminates errors caused by using dart:io functionality in web browsers.
- Maintains a familiar API similar to the dart:io Platform class, making migration and usage effortless.
- Handles system-specific properties like the number of processors, path separator, and local hostname, with sensible defaults on web platforms.
Example Usage:
print('TargetPlatform: ${PlatformEnv.targetPlatform}');
print('Is Web: ${PlatformEnv.isWeb}');
print('Is macOS: ${PlatformEnv.isMacOS}');
// and all other Platform getters are supported.
Adaptive UI
Create responsive layouts for different screen sizes and platforms (mobile, tablet, desktop).
Features
- Efficient: Rebuilds only when the platform type changes.
- Easy-to-use context extensions: Access platform/orientation information directly.
- Customizable: Define your own breakpoints and helper extensions.
- Layout builders: Convenient widgets for building adaptive UI.
Basic Usage
PlatformTypeProvider( // Wrap your app
child: MyApp(),
); // optionally receive custom breakpoints.
@override
Widget build(BuildContext context) {
final breakpoint = context.breakpoint; // rebuilds on change.
return breakpoint.isMobile ? const MobileLayout() : const TabletLayout();
}
See the detailed documentation for adaptive ui to explore more.
Extensions
All the extensions included in the dart_helper_utils
package plus:
Listenable & ValueNotifier
on ValueListenable
builder
: Simplifies the creation of aValueListenableBuilder
widget that reacts to changes in a singleValueListenable
.-
final intNotifier = 0.notifier; intNotifier.builder((value) => /* widget reacts to intNotifier changes */ );
-
on Listenable
.builder
: Simplifies the creation of aListenableBuilder
widget that reacts to changes in anyListenable
.-
final scrollController = ScrollController(); scrollController.builder((context) => /* widget reacts to scrollController changes */ );
-
on List
.builder
: Creates aListenablesBuilder
widget to efficiently manage and respond to changes in multipleListenable
objects simultaneously, includingValueNotifier
,ChangeNotifier
, and others. Customize rebuild behavior using the optionalbuildWhen
andthreshold
parameters.-
final myListeners = <Listenable>[textController, scrollController, anyNotifier]; myListeners.builder((context) => /* widget reacts to myListeners changes */ );
-
ValueNotifier Creation
.notifier
: Converts a value of any type into the correspondingValueNotifier
type/subtype, enabling easy integration into reactive UI components.- e.g.,
final intNotifier = 1.notifier
creates anIntNotifier
, akaValueNotifier<int>
.
- e.g.,
UI & Design
Colors
toHex
: Transforms aColor
object into its corresponding hexadecimal string representation.darken
,lighten
: Adjust color lightness.shade
,tint
: Create variations by mixing with black/white.contrast
: Calculate contrast ratios between colors.complementary
: Find the opposite color on the color wheel.blend
: Mix colors.grayscale
,invert
: Convert to grayscale or invert colors.toColor
: Creates aColor
object from a valid hexadecimal color string"#FFFFFF".toColor()
.isHexColor
: Determines if a given string is a valid hexadecimal color representation"#FFFFFF".isHexColor()
.
ThemeData
isDark
,isLight
: Checks whether the current theme is in dark or light mode.textTheme
: Provides direct access to theTextTheme
of the current theme.displayLarge
,displayMedium
,displaySmall
, etc.: Retrieve specific text styles from the theme, optimized for different display sizes.displayLargeCopy
,displayMediumCopy
,displaySmallCopy
, etc.: Retrieve copies of the specific text styles from the theme, allowing modifications without affecting the original theme.
TargetPlatform
All the above getters are available under both BuildContext
instances and TargetPlatform
instances.
Native Only Platforms
isMobile
: true if running on a mobile device (iOS or Android) natively.isIOS
: true if running on iOS natively.isAndroid
: true if running on Android natively.isDesktop
: true if running on a desktop OS (Linux, macOS, Windows) natively.isMacOS
: true if running on macOS natively.isWindows
: true if running on Windows natively.isLinux
: true if running on Linux natively.isApple
: true if running on any Apple platform (macOS or iOS) natively.
Web Platforms
isMobileWeb
: true if running on a mobile browser (iOS or Android).isIOSWeb
: true if running on iOS in a web browser.isAndroidWeb
: true if running on Android in a web browser.isDesktopWeb
: true if running on a desktop browser (Linux, macOS, Windows).isMacOSWeb
: true if running on macOS in a web browser.isWindowsWeb
: true if running on Windows in a web browser.isLinuxWeb
: true if running on Linux in a web browser.isAppleWeb
: true if running on an Apple platform (macOS or iOS) in a web browser.
BuildContext
Important Note: Avoid frequent use of context on actions that might call of(context)
, like theme. The widget registers itself as a dependency on the theme, meaning that if the theme changes (e.g., when switching between light/dark mode), all widgets using Theme.of(context)
, aka context.themeData
, will rebuild, even if they don’t directly depend on the changed theme properties. It’s recommended to use final theme = context.themeData
at the top of the widget tree only once.
For Themes
themeData
: Get the currentThemeData
.txtTheme
: Obtain theTextTheme
.brightness
: Determine the theme's brightness.sysBrightness
: Determine the system's brightness.isDark
,isLight
: Check if the theme is dark or light.targetPlatform
: Get the currentTargetPlatform
; all the getters mentioned in TargetPlatform are also available here.withoutEffects()
: Remove visual feedback effects (splash, highlight, hover, etc.) from a theme with customizations.
For MediaQuery
mq
: AccessMediaQueryData
.nullableMQ
: AccessMediaQueryData
(nullable).deviceOrientation
: Get device orientation.navigationMode
: Get navigation mode.padding
,viewInsets
: Get screen padding and insets.screenDimensions
: Get screen width and height.additionalFeatures
: Access additional features.
For FocusScope
focusScope
: Get the nearestFocusScopeNode
.unFocus
: Remove focus.requestFocus
: Request focus.requestFocusCall
: Request focus (usingGestureTapCallback
).hasFocus
: Check if a node has focus.hasPrimaryFocus
: Check if a node has primary focus.
For Navigation
popPage
: Pop the current page.popRoot
: Pop to the root page.navigator
: Get theNavigatorState
.canPop
: Check if you can pop the current page.pPage
: Push a new page.pReplacement
: Push and replace the current page.pAndRemoveUntil
: Push and remove pages until a condition is met.pNamedAndRemoveUntil
: Push a named route and remove pages until a condition is met.pNamed
: Push a named route.pReplacementNamed
: Push and replace the current page with a named route.popUntil
: Pop pages until a condition is met.dismissActivePopup
: Dismiss the active popup.
Widgets
Align
alignAtBottomCenter
,alignAtTopLeft
,alignAtBottomLeft
, etc.: Align a widget within its parent using various alignment options.alignXY
: Align a widget using explicit x and y coordinates.alignAtLERP
: Align a widget using linear interpolation between two alignments.
Padding
paddingAll
: Add padding on all sides of a widget.paddingLTRB
: Add padding with individual values for a left, top, right, and bottom.paddingSymmetric
: Add padding symmetrically for horizontal and vertical.paddingOnly
: Add padding to specific sides.
More widget extensions to be added soon.
List/Iterable Extensions
toRow
: Convert a list of widgets into aRow
.toColumn
: Convert a list of widgets into aColumn
.toStack
: Convert a list of widgets into aStack
.toList
: Convert anIterable
to aList
.toListView
: Convert anIterable
to aListView
.
Contributions
Contributions to this package are welcome. If you have any suggestions, issues, or feature requests, please create a pull request in the repository.
License
flutter_helper_utils
is available under the BSD 3-Clause License.