nylo_support
Support library for the Nylo framework. This library supports routing, widgets, localization, cli, storage and more.
7.28.0
2.8K downloads/mo
#4774 most downloaded on pub.dev
nylo-core/support
What this package is like to depend on
Last release 3 days ago
21 Aug 2026
Ships fairly regularly
a new release about every 2 weeks
Nearly every release is documented
notes for 262 of 270 stable releases
Nothing withdrawn
no release was ever pulled
5 years old
270 releases · first in 2021
55 releases in the last 12 months
see the full history below
Release timeline
270 releases · Jul 2021 to Aug 2026Releases
latest 60 of 270-
7.28.021 Aug 2026Release notes
Open source →Added
nameandpathconstructor parameters onNavigationHub-NavigationHub(this.pages, {super.name, super.path})forwards both toNyPage, so a hub can declare the state name it is addressed by. This lets a hub and theNavigationHubStateActionsthat drive it agree on one name, e.g.MyHub({super.key}) : super(child: () => _MyHubState(), stateName: path.stateName());alongsidestatic NavigationHubStateActions stateActions = NavigationHubStateActions(path.stateName());NyStatefulWidget.declaredStateName- Holds thestateNamepassed to the constructor, when one was given. The existingstatemember becomes a computed getter that returnsdeclaredStateNamewhen set and otherwise derives the name from the widget's own class, so the name a widget listens on is always available even where nostateNamewas declared- A reported route whose builder names no page - A route built from a function declared to return
Widget- a tear-off of a named function, or a variable typed as theRouteViewsignature - carries that declared type at runtime instead of the page class, so the page behind it cannot be read back from the route and the derived state name reaches nothing.NyLogger.errornow names such a route once, with both ways to address it: build the route from a closure that returns the page,("/my-page", (_) => MyPage()), or give the page a name of its own viasuper(child: () => _MyPageState(), stateName: "/my-page"). Previously the state update was dropped by the event bus in silence - A reported state name that reaches no
NavigationHub-NavigationHubStateActions.nextPage()andpreviousPage()now report once, viaNyLogger.error, when no hub is listening on the name they address, detected from the absence of the${state}_current_tabkey a hub writes as the first thing itsinitdoes. A journey that could not advance previously did so without a trace
Changed
- State names are built from the page's widget class on both ends of a state update - Every name now resolves through a single helper (
lib/helpers/src/state_name.dart), so the listening end (NyPage,NyState) and the sending end (RouteViewExt.stateName,updateStatewith aRouteView,stateAction) build the same string from the same class. The widget class is the anchor because it is the only class both ends can see - a sender holds aRouteView, which knows the widget it builds and nothing about the state behind it. For the naming convention Metro scaffolds (MyPagewith_MyPageState) the resulting name is unchanged; a state class named outside that convention now resolves toClosure: () => _${WidgetClass}Stateon both ends rather than to its own class name NyStatepoints its controller at the page it is used from -_controller.stateis now assigned the resolvedstateNameon everyinitState, rather than only when it still held the initial"/". A controller registered as a singleton is shared by every page that asks for it, socontroller.refreshPage()and the other controller state helpers now address the page they are called from instead of the name an earlier page left behind
Fixed
- State updates not arriving in obfuscated builds - The listening end read the state class (
child.runtimeType) while senders read the widget class from the route builder's return type.flutter build --obfuscaterenames a widget and its state to two unrelated symbols, so the two ends produced names that no longer matched and every update sent to the page was dropped. Both ends now read the widget class, which a compiler that renames classes renames for both at once.updateState's history lookup contributed the same failure throughelement.event.runtimeType.toString() != 'UpdateState', a comparison against a class name that obfuscation rewrites; it now testsevent is! UpdateStateand reads the event'sdatafield rather thanprops[1] NyPageadopting another page's state data on init - Restoring from the event bus history took the lastUpdateStateentry regardless of which state it was sent to, so a page could open holding a payload addressed to a different page. The lookup now matchesstateNamebefore taking the most recent entryJourneyState.isLastStepreporting the last step where a journey has no steps - WithtotalStepsat0the comparison read0 >= -1and answered true, so a step whose hub data had not been read yet was treated as the end of the journey. The getter now requirestotalSteps > 0
Release notes
Open source →Added
nameandpathconstructor parameters onNavigationHub-NavigationHub(this.pages, {super.name, super.path})forwards both toNyPage, so a hub can declare the state name it is addressed by. This lets a hub and theNavigationHubStateActionsthat drive it agree on one name, e.g.MyHub({super.key}) : super(child: () => _MyHubState(), stateName: path.stateName());alongsidestatic NavigationHubStateActions stateActions = NavigationHubStateActions(path.stateName());NyStatefulWidget.declaredStateName- Holds thestateNamepassed to the constructor, when one was given. The existingstatemember becomes a computed getter that returnsdeclaredStateNamewhen set and otherwise derives the name from the widget's own class, so the name a widget listens on is always available even where nostateNamewas declared- A reported route whose builder names no page - A route built from a function declared to return
Widget- a tear-off of a named function, or a variable typed as theRouteViewsignature - carries that declared type at runtime instead of the page class, so the page behind it cannot be read back from the route and the derived state name reaches nothing.NyLogger.errornow names such a route once, with both ways to address it: build the route from a closure that returns the page,("/my-page", (_) => MyPage()), or give the page a name of its own viasuper(child: () => _MyPageState(), stateName: "/my-page"). Previously the state update was dropped by the event bus in silence - A reported state name that reaches no
NavigationHub-NavigationHubStateActions.nextPage()andpreviousPage()now report once, viaNyLogger.error, when no hub is listening on the name they address, detected from the absence of the${state}_current_tabkey a hub writes as the first thing itsinitdoes. A journey that could not advance previously did so without a trace
Changed
- State names are built from the page's widget class on both ends of a state update - Every name now resolves through a single helper (
lib/helpers/src/state_name.dart), so the listening end (NyPage,NyState) and the sending end (RouteViewExt.stateName,updateStatewith aRouteView,stateAction) build the same string from the same class. The widget class is the anchor because it is the only class both ends can see - a sender holds aRouteView, which knows the widget it builds and nothing about the state behind it. For the naming convention Metro scaffolds (MyPagewith_MyPageState) the resulting name is unchanged; a state class named outside that convention now resolves toClosure: () => _${WidgetClass}Stateon both ends rather than to its own class name NyStatepoints its controller at the page it is used from -_controller.stateis now assigned the resolvedstateNameon everyinitState, rather than only when it still held the initial"/". A controller registered as a singleton is shared by every page that asks for it, socontroller.refreshPage()and the other controller state helpers now address the page they are called from instead of the name an earlier page left behind
Fixed
- State updates not arriving in obfuscated builds - The listening end read the state class (
child.runtimeType) while senders read the widget class from the route builder's return type.flutter build --obfuscaterenames a widget and its state to two unrelated symbols, so the two ends produced names that no longer matched and every update sent to the page was dropped. Both ends now read the widget class, which a compiler that renames classes renames for both at once.updateState's history lookup contributed the same failure throughelement.event.runtimeType.toString() != 'UpdateState', a comparison against a class name that obfuscation rewrites; it now testsevent is! UpdateStateand reads the event'sdatafield rather thanprops[1] NyPageadopting another page's state data on init - Restoring from the event bus history took the lastUpdateStateentry regardless of which state it was sent to, so a page could open holding a payload addressed to a different page. The lookup now matchesstateNamebefore taking the most recent entryJourneyState.isLastStepreporting the last step where a journey has no steps - WithtotalStepsat0the comparison read0 >= -1and answered true, so a step whose hub data had not been read yet was treated as the end of the journey. The getter now requirestotalSteps > 0
-
7.27.518 Aug 2026Release notes
Open source →Changed
- Bumped
intlfrom^0.20.2to^0.20.3,flutter_local_notificationsfrom^22.2.0to^22.3.0,app_badge_plusfrom^1.3.2to^1.3.4,win32from^6.3.0to^6.4.0, andpatrol(dev) from^4.8.0to^4.9.0- routine compatibility refreshes - Excluded platform build output directories (
build/,android/,ios/,web/,windows/,macos/,linux/) from static analysis inanalysis_options.yaml- keeps the analyzer focused on the package's Dart sources
Fixed
MetroService.discoverCustomCommandsreturning an unawaitedFutureinside its try block - an asynchronous failure fromdiscoverCommandswould escape the surrounding catch instead of surfacing the "Error loading custom commands" console message; the return is now awaited inlib/metro/src/metro_service.dartCollectionViewpassing the deprecatedcacheExtentparameter to its internalListViews - Flutter deprecatedcacheExtentin favour ofscrollCacheExtentafter v3.41.0-0.0.pre. The three list builders inlib/widgets/src/collection_view.dartnow passscrollCacheExtent, converting the widget'sdouble? cacheExtenttoScrollCacheExtent.pixels(...)- the same pixel semantics as before, so the publicCollectionView.cacheExtentAPI is unchanged
Release notes
Open source →Changed
- Bumped
intlfrom^0.20.2to^0.20.3,flutter_local_notificationsfrom^22.2.0to^22.3.0,app_badge_plusfrom^1.3.2to^1.3.4,win32from^6.3.0to^6.4.0, andpatrol(dev) from^4.8.0to^4.9.0- routine compatibility refreshes - Excluded platform build output directories (
build/,android/,ios/,web/,windows/,macos/,linux/) from static analysis inanalysis_options.yaml- keeps the analyzer focused on the package's Dart sources
Fixed
MetroService.discoverCustomCommandsreturning an unawaitedFutureinside its try block - an asynchronous failure fromdiscoverCommandswould escape the surrounding catch instead of surfacing the "Error loading custom commands" console message; the return is now awaited inlib/metro/src/metro_service.dartCollectionViewpassing the deprecatedcacheExtentparameter to its internalListViews - Flutter deprecatedcacheExtentin favour ofscrollCacheExtentafter v3.41.0-0.0.pre. The three list builders inlib/widgets/src/collection_view.dartnow passscrollCacheExtent, converting the widget'sdouble? cacheExtenttoScrollCacheExtent.pixels(...)- the same pixel semantics as before, so the publicCollectionView.cacheExtentAPI is unchanged
- Bumped
-
7.27.402 Aug 2026Release notes
Open source →Changed
- Bumped
diofrom^5.10.0to^5.11.0,connectivity_plusfrom^7.2.0to^7.3.1,flutter_local_notificationsfrom^22.0.1to^22.2.0,uuidfrom^4.5.3to^4.6.0,app_linksfrom^7.2.0to^7.2.1,app_badge_plusfrom^1.3.1to^1.3.2,get_time_agofrom^2.4.0to^2.4.1,error_stackfrom^2.1.4to^2.1.5, andpatrol(dev) from^4.6.1to^4.8.0- routine compatibility refreshes
Release notes
Open source →Changed
- Bumped
diofrom^5.10.0to^5.11.0,connectivity_plusfrom^7.2.0to^7.3.1,flutter_local_notificationsfrom^22.0.1to^22.2.0,uuidfrom^4.5.3to^4.6.0,app_linksfrom^7.2.0to^7.2.1,app_badge_plusfrom^1.3.1to^1.3.2,get_time_agofrom^2.4.0to^2.4.1,error_stackfrom^2.1.4to^2.1.5, andpatrol(dev) from^4.6.1to^4.8.0- routine compatibility refreshes
- Bumped
-
7.27.306 Jul 2026Release notes
Open source →Changed
- Re-tightened
collectionfrom^1.18.0to^1.19.1andcharactersfrom^1.4.0to^1.4.1- both packages are vendored by the Flutter SDK, and the>=3.44.0floor adopted in 7.27.2 shipscollection 1.19.1andcharacters 1.4.1, so the constraints now match the versions the minimum supported Flutter provides - Bumped
diofrom^5.9.2to^5.10.0,connectivity_plusfrom^7.1.1to^7.2.0,app_linksfrom^7.1.1to^7.2.0,equatablefrom^2.0.8to^2.1.0,get_time_agofrom^2.3.2to^2.4.0,flutter_local_notificationsfrom^22.0.0to^22.0.1,path_providerfrom^2.1.5to^2.1.6,timezonefrom^0.11.0to^0.11.1, andapp_badge_plusfrom^1.3.0to^1.3.1- routine compatibility refreshes
Release notes
Open source →Changed
- Re-tightened
collectionfrom^1.18.0to^1.19.1andcharactersfrom^1.4.0to^1.4.1- both packages are vendored by the Flutter SDK, and the>=3.44.0floor adopted in 7.27.2 shipscollection 1.19.1andcharacters 1.4.1, so the constraints now match the versions the minimum supported Flutter provides - Bumped
diofrom^5.9.2to^5.10.0,connectivity_plusfrom^7.1.1to^7.2.0,app_linksfrom^7.1.1to^7.2.0,equatablefrom^2.0.8to^2.1.0,get_time_agofrom^2.3.2to^2.4.0,flutter_local_notificationsfrom^22.0.0to^22.0.1,path_providerfrom^2.1.5to^2.1.6,timezonefrom^0.11.0to^0.11.1, andapp_badge_plusfrom^1.3.0to^1.3.1- routine compatibility refreshes
- Re-tightened
-
7.27.207 Jun 2026Release notes
Open source →Changed
- Bumped
flutter_local_notificationsfrom^21.0.0to^22.0.0- the v22 line ships a dedicated web implementation (the newflutter_local_notifications_web) and advances the platform interface to12.0.0 - Bumped
app_linksfrom^7.0.0to^7.1.1,flutter_timezonefrom^5.0.2to^5.1.0,app_badge_plusfrom^1.2.10to^1.3.0,flutter_secure_storagefrom^10.3.0to^10.3.1, andpatrol(dev) from^4.6.0to^4.6.1- routine compatibility refreshes - Raised the
environmentconstraints tosdk: ^3.12.0andflutter: ">=3.44.0"- the upgraded dependencies lift the resolved floor to Dart 3.12.0 / Flutter 3.44.0, so the declared minimums now state the true requirement
Release notes
Open source →Changed
- Bumped
flutter_local_notificationsfrom^21.0.0to^22.0.0- the v22 line ships a dedicated web implementation (the newflutter_local_notifications_web) and advances the platform interface to12.0.0 - Bumped
app_linksfrom^7.0.0to^7.1.1,flutter_timezonefrom^5.0.2to^5.1.0,app_badge_plusfrom^1.2.10to^1.3.0,flutter_secure_storagefrom^10.3.0to^10.3.1, andpatrol(dev) from^4.6.0to^4.6.1- routine compatibility refreshes - Raised the
environmentconstraints tosdk: ^3.12.0andflutter: ">=3.44.0"- the upgraded dependencies lift the resolved floor to Dart 3.12.0 / Flutter 3.44.0, so the declared minimums now state the true requirement
- Bumped
-
7.27.102 Jun 2026Release notes
Open source →Fixed
NetworkLoggercrashing the Flutter tool's log reader on multi-byte characters - The interceptor wrapped long request/response lines withString.substring, which slices on UTF-16 code-unit boundaries and can cut a surrogate pair (any non-BMP character, e.g. an emoji) in half. The resulting lone surrogates are encoded as U+FFFD on stdout, which crashed the Flutter tool's log reader. Line wrapping now iterates grapheme clusters viapackage:characters, keeping emoji - along with composed sequences like flags and ZWJ emoji - whole. This affects both_printBlockand the key/value pretty-printer inlib/networking/src/interceptors/network_logger.dart
Release notes
Open source →Fixed
NetworkLoggercrashing the Flutter tool's log reader on multi-byte characters - The interceptor wrapped long request/response lines withString.substring, which slices on UTF-16 code-unit boundaries and can cut a surrogate pair (any non-BMP character, e.g. an emoji) in half. The resulting lone surrogates are encoded as U+FFFD on stdout, which crashed the Flutter tool's log reader. Line wrapping now iterates grapheme clusters viapackage:characters, keeping emoji - along with composed sequences like flags and ZWJ emoji - whole. This affects both_printBlockand the key/value pretty-printer inlib/networking/src/interceptors/network_logger.dart
-
7.27.025 May 2026Release notes
Open source →Added
- Multi-instance
NyStateManagedwidgets -NyStateManagednow exposes abaseState(widget-type identifier) and anid(instance identifier) constructor parameter, plus a composedstateKeygetter that resolves tobaseStatewhenidis null and"${baseState}_$id"otherwise. Multiple instances of the same managed widget can now receive scoped state updates rather than sharing a single routing key stateAction(action, state:, id:)- The state-action helper accepts a new optionalidargument; whenstateis aStringandidis supplied, the dispatch key becomes"${state}_$id", delivering the action to the matchingNyStateManagedinstance onlynameconstructor parameter onNyBaseState,NyState,NyPage, andJourneyState- Provides an explicit state-name override. When set it takes precedence over the existingpathargument (stateName = name ?? path).NyState.initStateadditionally adopts the parentNyStateManaged.stateKeyas itsstateNamewhen the managed widget declares abaseState, so the routing key flows from the widget down to its state automatically
Deprecated
NyStateManaged.stateName(constructor parameter and getter) - Superseded byid. The constructor still acceptsstateNameand forwards it toid(id = id ?? stateName), and thestateNamegetter now returnsid, so existing call sites keep compiling. New code should passbaseState+idand readstateKeyfor the composed routing key
Release notes
Open source →Added
- Multi-instance
NyStateManagedwidgets -NyStateManagednow exposes abaseState(widget-type identifier) and anid(instance identifier) constructor parameter, plus a composedstateKeygetter that resolves tobaseStatewhenidis null and"${baseState}_$id"otherwise. Multiple instances of the same managed widget can now receive scoped state updates rather than sharing a single routing key stateAction(action, state:, id:)- The state-action helper accepts a new optionalidargument; whenstateis aStringandidis supplied, the dispatch key becomes"${state}_$id", delivering the action to the matchingNyStateManagedinstance onlynameconstructor parameter onNyBaseState,NyState,NyPage, andJourneyState- Provides an explicit state-name override. When set it takes precedence over the existingpathargument (stateName = name ?? path).NyState.initStateadditionally adopts the parentNyStateManaged.stateKeyas itsstateNamewhen the managed widget declares abaseState, so the routing key flows from the widget down to its state automatically
Deprecated
NyStateManaged.stateName(constructor parameter and getter) - Superseded byid. The constructor still acceptsstateNameand forwards it toid(id = id ?? stateName), and thestateNamegetter now returnsid, so existing call sites keep compiling. New code should passbaseState+idand readstateKeyfor the composed routing key
- Multi-instance
-
7.26.223 May 2026Release notes
Open source →Changed
- Bumped
error_stackfrom^2.1.3to^2.1.4- routine compatibility refresh
Release notes
Open source →Changed
- Bumped
error_stackfrom^2.1.3to^2.1.4- routine compatibility refresh
- Bumped
-
7.26.123 May 2026Release notes
Open source →Changed
- Bumped
win32from^5.15.0to^6.3.0- the v6 API tightens the FFI surface: console handles are now exposed as the typedHANDLEstruct (with.valuereturning the rawint),SetConsoleModeaccepts aCONSOLE_MODEwrapper around its mode bitmask, andCONSOLE_CURSOR_INFO.bVisibleis aboolinstead of a0/1integer.TermLibWindows(lib/dart_console/src/ffi/win/termlib_win.dart) has been updated for each of these:inputHandle/outputHandleare nowHANDLE, populated viaGetStdHandle(...).value;disableRawMode()wraps its bitmask inCONSOLE_MODE(...);disabledRawModeMaskis now typedCONSOLE_MODE; andhideCursor/showCursorsetbVisible = false/bVisible = true - Bumped
app_linksfrom^6.3.2to^7.0.0- keeps the deep-link plumbing introduced in 7.26.0 (Nylo.useDeepLinks,Nylo.onIncomingLink,NyDeepLinkHandler) aligned with the latest plugin - Bumped
flutter_secure_storagefrom^10.0.0to^10.3.0,error_stackfrom^2.1.2to^2.1.3,flutter_multi_formatterfrom^2.13.10to^2.13.11,app_badge_plusfrom^1.2.9to^1.2.10, andpatrolfrom^4.5.0to^4.6.0- routine compatibility refreshes
Release notes
Open source →Changed
- Bumped
win32from^5.15.0to^6.3.0- the v6 API tightens the FFI surface: console handles are now exposed as the typedHANDLEstruct (with.valuereturning the rawint),SetConsoleModeaccepts aCONSOLE_MODEwrapper around its mode bitmask, andCONSOLE_CURSOR_INFO.bVisibleis aboolinstead of a0/1integer.TermLibWindows(lib/dart_console/src/ffi/win/termlib_win.dart) has been updated for each of these:inputHandle/outputHandleare nowHANDLE, populated viaGetStdHandle(...).value;disableRawMode()wraps its bitmask inCONSOLE_MODE(...);disabledRawModeMaskis now typedCONSOLE_MODE; andhideCursor/showCursorsetbVisible = false/bVisible = true - Bumped
app_linksfrom^6.3.2to^7.0.0- keeps the deep-link plumbing introduced in 7.26.0 (Nylo.useDeepLinks,Nylo.onIncomingLink,NyDeepLinkHandler) aligned with the latest plugin - Bumped
flutter_secure_storagefrom^10.0.0to^10.3.0,error_stackfrom^2.1.2to^2.1.3,flutter_multi_formatterfrom^2.13.10to^2.13.11,app_badge_plusfrom^1.2.9to^1.2.10, andpatrolfrom^4.5.0to^4.6.0- routine compatibility refreshes
- Bumped
-
7.26.021 May 2026Release notes
Open source →Added
- Deep linking support - New
Nylo.useDeepLinks({String? fallbackRoute})opts the app into platform deep-link capture (Android App Links, iOS Universal Links, custom URL schemes, and web URLs) through the newapp_linksdependency. Captured URIs are routed through the registeredNyRouter; a path that is not registered routes tofallbackRoutewhen one is supplied, otherwise it falls through to the existing unknown-route handler Nylo.onIncomingLink((Uri uri) async => bool)- Registers a callback invoked for every captured deep link before routing. Returntrueto let Nylo route automatically, orfalseto handle the URI yourselfNyDeepLinkHandler- Exported fromrouter/ny_router.dart; encapsulates cold-start and warm-start URI capture and dispatch, with injectableAppLinksand dispatcher seams for testing
Changed
- Relaxed
collectionfrom^1.19.1to^1.18.0-collectionis also vendored by the Flutter SDK; the looser floor removes the same class of resolution conflict as thecharactersfix below - Corrected the
environmentFlutter constraint from>=3.24.0to>=3.38.4- the previous value could not be satisfied alongside thesdk: ^3.10.7Dart constraint (Flutter 3.24 ships Dart 3.5), so it now states the true minimum
Deprecated
Nylo.onDeepLink(callback)- Superseded byNylo.onIncomingLink. The old form fires on every named route, not just deep links; it will be removed in 8.0
Fixed
- Nylo no longer crashes on Flutter web during boot -
NyLogger._colorize()accessedstdout.supportsAnsiEscapes, which throwsUnsupported operationon web becausedart:iois unavailable in the browser.stdoutaccess is now guarded behind akIsWebcheck .dd()no longer throwsUnsupportedErroron Flutter web - thedd()("dump and die") extensions onString,int,double,bool,Map,List, andDateTimecalleddart:io'sexit(0), which is unavailable on web. Dump-and-exit now routes through the newNyLogger.dd()helper, which skips theexit()step on web and behaves likedump()thereflutter pub getnow resolves across all supported Flutter releases -characterswas constrained to^1.4.1, but the Flutter SDK vendorscharactersat an exact version and the 3.38 stable line ships1.4.0. Dependency resolution therefore failed on any Flutter release that bundlescharacters 1.4.0. The constraint is now^1.4.0, which resolves whether the SDK bundles1.4.0or1.4.1- Router page transitions compile on Flutter 3.44+ - Flutter 3.44 relocated
CupertinoPageTransitionsBuilderfrom the material library to the cupertino library. The router transition files (ny_page_transition_settings.dart,page_transition.dart,transition_type.dart) now importpackage:flutter/cupertino.dartso the class resolves on current Flutter releases
Release notes
Open source →Added
- Deep linking support - New
Nylo.useDeepLinks({String? fallbackRoute})opts the app into platform deep-link capture (Android App Links, iOS Universal Links, custom URL schemes, and web URLs) through the newapp_linksdependency. Captured URIs are routed through the registeredNyRouter; a path that is not registered routes tofallbackRoutewhen one is supplied, otherwise it falls through to the existing unknown-route handler Nylo.onIncomingLink((Uri uri) async => bool)- Registers a callback invoked for every captured deep link before routing. Returntrueto let Nylo route automatically, orfalseto handle the URI yourselfNyDeepLinkHandler- Exported fromrouter/ny_router.dart; encapsulates cold-start and warm-start URI capture and dispatch, with injectableAppLinksand dispatcher seams for testing
Changed
- Relaxed
collectionfrom^1.19.1to^1.18.0-collectionis also vendored by the Flutter SDK; the looser floor removes the same class of resolution conflict as thecharactersfix below - Corrected the
environmentFlutter constraint from>=3.24.0to>=3.38.4- the previous value could not be satisfied alongside thesdk: ^3.10.7Dart constraint (Flutter 3.24 ships Dart 3.5), so it now states the true minimum
Deprecated
Nylo.onDeepLink(callback)- Superseded byNylo.onIncomingLink. The old form fires on every named route, not just deep links; it will be removed in 8.0
Fixed
- Nylo no longer crashes on Flutter web during boot -
NyLogger._colorize()accessedstdout.supportsAnsiEscapes, which throwsUnsupported operationon web becausedart:iois unavailable in the browser.stdoutaccess is now guarded behind akIsWebcheck .dd()no longer throwsUnsupportedErroron Flutter web - thedd()("dump and die") extensions onString,int,double,bool,Map,List, andDateTimecalleddart:io'sexit(0), which is unavailable on web. Dump-and-exit now routes through the newNyLogger.dd()helper, which skips theexit()step on web and behaves likedump()thereflutter pub getnow resolves across all supported Flutter releases -characterswas constrained to^1.4.1, but the Flutter SDK vendorscharactersat an exact version and the 3.38 stable line ships1.4.0. Dependency resolution therefore failed on any Flutter release that bundlescharacters 1.4.0. The constraint is now^1.4.0, which resolves whether the SDK bundles1.4.0or1.4.1- Router page transitions compile on Flutter 3.44+ - Flutter 3.44 relocated
CupertinoPageTransitionsBuilderfrom the material library to the cupertino library. The router transition files (ny_page_transition_settings.dart,page_transition.dart,transition_type.dart) now importpackage:flutter/cupertino.dartso the class resolves on current Flutter releases
- Deep linking support - New
-
7.25.015 May 2026Release notes
Open source →Added
- Closure-based validator on
InputField- Newvalidateparameter accepts(FormValidator validate, dynamic data) { ... }, letting you build rules inline without constructing aFormValidatorup front. Usevalidate.that(data, "Field").minLength(3)inside the closure. Mutually exclusive with the existingformValidatorparameter (enforced via assertion) FormValidator.that(data, [attribute])- New chainable configuration method that sets the value and attribute in a single call and returnsthis, designed for use insideInputField.validateclosuresFormValidatorCallbacktypedef - Public signaturevoid Function(FormValidator validate, dynamic data)for the closure used byInputField.validatepaddingOnly,paddingSymmetric, andvisibleWhenextensions onStatefulWidget- Previously only available onStatelessWidget;StyledTextand otherStatefulWidgets can now be wrapped via these fluent helpers (e.g.StyledText.template(...).paddingOnly(top: 20))
Fixed
InputField.handleValidationErrornow fires when validation results change - The callback was declared but never invoked by the internal_validateflow. Results are now reported on each transition (first run and whenever the error message changes), deferred to the next frame so handlers can safely callsetState
- Closure-based validator on
-
7.24.210 May 2026Release notes
Open source →Fixed
MetroService.runProcessno longer breaks the parent CLI's stdin - the helper used to wirestdin.pipe(process.stdin)to the child, which left the parent's stdin in a consumed state once the child exited. SubsequentreadLineSync-based prompts (e.g. in scaffold-ui's auth/iap dialogs) returnednulland the unhandled!-on-null tore down the program. The child now inherits the parent's file descriptors directly viaProcessStartMode.inheritStdio, leaving the parent's stdin untoucheddart_console.disableRawMode()no longer zeroes the Windows console mode - the disabled-mode bitmask was built with&instead of|, so the OR-only-makes-sense flags resolved to0andSetConsoleMode(handle, 0)killed line input, echo, and processed input. As a result,stdin.readLineSyncon Windows could not detect Enter after aConsole.readKeycall. The mask is now correctly OR-combined
-
7.24.110 May 2026Release notes
Open source →Fixed
CollectionViewno longer crashes mid-refresh on long lists -_onRefreshpreviously assigned_data = []synchronously before awaiting the new data, which could leave the liveSliverListpointing at an empty list mid-frame and throwRangeErrorwhen cached children relayed out._datais now mutated only insidesetStateafter the new data resolvesCollectionViewacceptsList<dynamic>returned from JSON-decoded API responses - previously aList<dynamic>(the typical shape fromjsonDecode) would trip an internalList<T>assertion. The widget now lazily casts viaList.cast<T>(), so callers no longer have to call.cast<T>()themselvesCollectionView.stateActions(name).refreshData()no longer clears the list mid-fetch -_datawas being cleared synchronously before the new data resolved, briefly showing an empty state. The list is now preserved until the new data is ready- Null result from
paginatedDataon pull-to-refresh now preserves the existing list instead of incorrectly callingloadNoData(). The refresh indicator settles and the previous data remains visible
-
7.24.007 May 2026Release notes
Open source →Added
Strhelper class - New static utility class for string manipulation. Includes search/position helpers (after,before,between,contains,startsWith,endsWith,is_,position,match,excerpt), case conversions (camel,snake,kebab,studly,title,headline), trimming/capping (limit,words,finish,start,wrap,unwrap,squish), replace/transform (replace,remove,swap,deduplicate,ucsplit), slug generation, padding (padBoth,padLeft,padRight,padNumber), substring/chars (substr,take,charAt,reverse,repeat), masking, random/IDs (random,password,uuid,uuid7,ulid), and validation (isAscii,isJson,isUrl,isUuid,isUlid)Numberhelper class - New static utility class for working with numbers. Includes formatting (format,currency,percentage,fileSize,forHumans,abbreviate), ordinal/spelling (ordinal,spell,spellOrdinal), parsing (parseInt,parseFloat), math/utility (clamp,trim,pairs,between,round,floor,ceil,lerp,scale,gcd,lcm,degrees,radians), random generation, file-size inverse/duration (toBytes,duration), and range/aggregates (range,sum,average,median,min,max). Configurable default locale and currencyArrhelper class - New static utility class for working with lists. Includes type checks (accessible,isList,isAssoc), construction (wrap,flatten,collapse,crossJoin), filtering (first,last,where,reject,whereNotNull,unique,exceptValues,onlyValues), slicing/chunking (take,chunk,prepend,push,interleave), ordering (shuffle,sort,sortDesc,sortRecursive), random selection, iteration (map,mapWithKeys,flatMap,indexed,partition,groupBy), immutable mutations (replaceAt,move,swap), aggregates (every,some,sole,join,sum,average,median,min,max,countBy), and map-list operations (pluck,keyBy,select)Objhelper class - New static utility class for working with maps using dot notation. Includes read (get,has,hasAny,hasAll,exists), typed read (getString,getInt,getDouble,getBool,getList,getMap), mutating writes (set,add,forget,pull), subset (only,except,prependKeysWith,divide), filter (whereNotNull,whereNotEmpty), transform (mapKeys,mapValues,flip), flatten/inflate (dot,undot), and merge/compare/query helpers (merge,deepEquals,query)
-
7.23.101 May 2026 -
7.23.030 Apr 2026Release notes
Open source →Added
NyStateManagedwidget - A newStatefulWidgetthat accepts achild(either aStateinstance or a function returning one) and an optionalstateName, allowing pre-built states to be wired into the widget tree directly viacreateState. Exported frompackage:nylo_support/widgets/ny_widgets.dart
-
7.22.028 Apr 2026Release notes
Open source →Added
- Toast helper methods now accept
durationanddataparameters -showToastSorry,showToastWarning,showToastInfo,showToastDanger,showToastOops, andshowToastSuccessnow forward optionalduration(custom display time) anddata(custom payload) arguments to the underlyingshowToastcall
Changed
descriptionparameter on toast helpers is now optional -showToastSorry,showToastWarning,showToastInfo,showToastDanger,showToastOops, andshowToastSuccessno longer requiredescription, aligning their signatures with the underlyingshowToastmethod. Existing call sites continue to work unchanged
- Toast helper methods now accept
-
7.21.028 Apr 2026Release notes
Open source →Removed (BREAKING)
- Metro CLI theme scaffolding commands removed - The
make:themeandmake:theme_colorsMetro commands have been removed along with their underlying methods (MetroService.makeTheme,MetroService.makeThemeColors,MetroService.addToTheme). ThethemesFolder,themeColorsFolder, andthemeDarkFlagconstants have also been removed. Themes can still be created manually inlib/resources/themes/
- Metro CLI theme scaffolding commands removed - The
-
7.20.226 Apr 2026 -
7.20.126 Apr 2026Release notes
Open source →Fixed
NyScheduler.getKeyTaskOnce(name)now returns the full prefixed storage key (ny_scheduler_${name}_once) instead of the unprefixed${name}_once. This makes the documented reset patternawait NyStorage.delete(NyScheduler.getKeyTaskOnce("welcome_to_app"))actually delete the stored flag
Added
NyScheduler.clearTaskOnce(name)convenience method that clears a once-task's executed state without needing to compute the storage key manually
Changed
- Bumped
app_badge_plusdependency from^1.2.8to^1.2.9
-
7.20.020 Apr 2026Release notes
Open source →Added
- New
useSafeAreaoption onNavigationHubLayout.journey()- Controls whether journey content is wrapped in aSafeArea. Defaults totrue(existing behavior). Set tofalsefor edge-to-edge journey pages where backgrounds should extend under system UI (status bar, home indicator)
- New
-
7.19.012 Apr 2026Release notes
Open source →Changed (BREAKING)
Connectivewidget redesigned - Flipped semantics from "show when connected" to "show when missing". RemovedonWifi,onMobile,onEthernet,onVpn,onBluetooth,onSatellite,onOther,onNoneparameters in favour of a singlenoInternetparameter that displays a fallback when the device has no internet (wifi, mobile, or ethernet). Migration: replaceonNone: widgetwithnoInternet: widget. UseConnective.builder()for any custom connectivity handling- Removed
showLoadingOnInitandloadingWidgetfromConnective- the initial connectivity check is near-instant, making a loading state unnecessary OfflineBannernow checks for internet absence (wifi/mobile/ethernet) rather thanNyConnectivityState.none, correctly showing the banner when the device only has non-internet connections
Added
- New
NyConnectivity.hasInternet()helper - Checks specifically for wifi, mobile, or ethernet connectivity. Stricter thanisOnline()which passes for any non-none result
Fixed
CollectionView.refreshDatastate action - Re-fetches data explicitly for both pullable and regular modes instead of relying onreboot(), resetting pagination, loading state, and footer state correctly
-
7.18.111 Apr 2026Release notes
Open source →Fixed
- CollectionView not updating when parent rebuilds with new data - Sync data callbacks (e.g.
data: () => _filteredList) were only read once due to_syncDataInitializedflag introduced in v7.16.0, breaking filtering/search patterns. AddeddidUpdateWidgetoverride to reset the flag on parent rebuilds while preservingstateActionsbehavior
Added
- CollectionView test coverage - Added 29 tests covering
CollectionItemhelpers, sync/async data, empty states, headers, spacing, transform/sort, separated/grid layouts, parent-driven data updates, and configuration options
- CollectionView not updating when parent rebuilds with new data - Sync data callbacks (e.g.
-
7.18.011 Apr 2026Release notes
Open source →Added
- New
actingAsGuest()test helper - Semantic alias forlogout()that reads better in test setup - New
expectApiCalledWith()test helper - Assert that an API endpoint was called with specific request data, checking both endpoint and request body via deep equality - New
expectWidgetCount()test helper - Assert that a widget of a given type appears exactly N times - New
expectTextVisible()/expectTextNotVisible()test helpers - Assert text presence or absence in the widget tree - New
expectVisible()/expectNotVisible()test helpers - Assert widget presence or absence using any Finder - New
assertOnRoute()test helper - Assert the current route matches a given route without implying navigation just occurred - New
navigateBack()test helper - Pop the current route and settle, simulating the back button - New
tapText()test helper - Find a widget by text, tap it, and settle in one call - New
fillField()test helper - Tap a form field, enter text, and settle in one call - New
scrollTo()test helper - Scroll until a widget is visible in the nearest Scrollable
- New
-
7.17.011 Apr 2026Release notes
Open source →Added
- New
visit()test helper - Pump a route with full Nylo navigation support, setting upMaterialAppwith the NyRouter's route generator, navigator key, and route history observer so thatrouteTonavigation works correctly in tests - New
assertNavigatedTo()test helper - Assert that the app navigated to a given route by checkingNylo.getCurrentRouteName()matches the expected route path - New
settle()test helper - A readable alias forpumpAndSettlethat waits for all animations, frame callbacks, and pending UI updates to complete
- New
-
7.16.011 Apr 2026Release notes
Open source →Fixed
- CollectionView
stateActionsnot working with synchronous data - State actions likeaddItem,insertItem,removeFromIndex, andupdateItemAtIndexwere being overwritten on every rebuild because_buildRegularViewre-called the data callback. Now synchronous data is only fetched once and preserved across rebuilds NyPagecontroller state name assignment - Controller now receives the correct state name
Added
- New
InputFieldstate actions -focus(),unfocus(), andtoggleObscure()for programmatic control of text fields - New
LanguageSwitcher.stateActions()-refresh()andsetLanguage()methods for programmatic language switching
Changed
- Bumped
app_badge_plusto^1.2.8 - Bumped
connectivity_plusto^7.1.1
- CollectionView
-
7.15.006 Apr 2026Release notes
Open source →Added
- Environment variable interpolation in
NyEnvRegistry- String env values now support${VAR_NAME}syntax to reference other env keys. For example,APP_URL=https://${APP_DOMAIN}will resolve by looking upAPP_DOMAIN. Supports chained references, non-string value conversion, and circular reference protection
- Environment variable interpolation in
-
7.14.103 Apr 2026Release notes
Open source →Fixed
bottomToTopandtopToBottompage transitions animating the previous route - AddedcanTransitionFromoverride toPageTransitionthat returnsfalseforbottomToTopandtopToBottomtransition types, preventing the outgoing page from sliding away during modal-style transitions
-
7.14.002 Apr 2026Release notes
Open source →Added
isDismissibleandenableDragparameters forNyBaseModal.show()- New optional parameters to control whether the modal can be dismissed by tapping the barrier (isDismissible, defaults totrue) and whether the modal supports drag-to-dismiss gestures (enableDrag, defaults totrue). Both are passed through to the underlyingshowModalBottomSheet
-
7.13.031 Mar 2026Release notes
Open source →Added
- Satellite connectivity support for
Connectivewidget andNyConnectivityState- Addedsatellitevalue to theNyConnectivityStateenum with mapping fromConnectivityResult.satellite, and addedonSatellitewidget parameter toConnectivefor rendering satellite-specific UI - Wildcard
*key forStyledText.templatestyles and onTap - When no exact or pipe-delimited key matches a placeholder, the styles/onTap map now falls back to a*wildcard key, allowing a single style or tap handler to apply to all placeholders
Changed
- Updated dependency constraint:
connectivity_plus^7.1.0
- Satellite connectivity support for
-
7.12.029 Mar 2026Release notes
Open source →Added
creationPathsupport for Metro scaffolding commands - Provider, route guard, form, and event scaffolding commands now supportcreationPathusingcreatePathForDartFileandcreateDirectoriesFromCreationPathfor consistent nested directory path handlingsetStatecallback parameter forNyFieldBuilder- TheNyFieldBuildertypedef now includes asetStatecallback parameter. ANyFieldBuilderLegacytypedef is available for backward compatibility.Field.builderaccepts both signatures
Changed
- Updated dependency constraints:
flutter_timezone^5.0.2,patrol^4.5.0
-
7.11.212 Mar 2026Release notes
Open source →Fixed
- Response data unavailable in
handleSuccess/handleFailurecallbacks - WhenskipMorphwas true (a callback was provided),morphedDatawas left null, sonyResponse.datawas inaccessible inside the callback. The raw response data is now passed through tomorphedDatawhen the type matches, allowing callbacks to accessnyResponse.data
- Response data unavailable in
-
7.11.112 Mar 2026Release notes
Open source →Fixed
toast-oopscalling wrong toast method - Thetoast-oopsstate action was incorrectly callingshowToastInfo()instead ofshowToastOops(), causing oops-style toasts to display as info-style toastsField.password()not respectingviewableparameter - Theviewableparameter was not being passed through toFieldStyleTextField.password(), so the password visibility toggle setting was ignored when constructing password fields
Changed
NyPage.initState()state name resolution - The state name forNyStatefulWidgetis now resolved unconditionally ininitState(), rather than only whenstateManagedis true. The event bus subscription logic is now a singlestateManaged && allowStateUpdatescheck with reduced nesting- Updated dependency constraints:
flutter_local_notifications^21.0.0,timezone^0.11.0,patrol^4.3.0
-
7.11.011 Mar 2026Release notes
Open source →Added
action()method onStateActions- New convenience method to callstateAction()directly from anyStateActionsinstance, accepting an action name and optional data parameter
Fixed
- Controller not initialized before
init()inNyPageandNyState- The controller is now eagerly constructed with the currentcontextif it hasn't been initialized yet, and the widget's state name is propagated to the controller before use. This fixes issues where the controller was not ready during early lifecycle methods
-
7.10.009 Mar 2026Release notes
Open source →Added
enableInteractiveSelectionforInputFieldandFieldStyleTextField- New parameter to control whether text selection handles and toolbar are shown. Available onInputField,InputField.compact,InputField.password,InputField.email,InputField.fromFieldStyleText, andFieldStyleTextField
Fixed
FieldStyleTextField.copyWithlosing existing values - Parameters liketextCapitalization,maxLengthEnforcement,onAppPrivateCommand,inputFormatters,cursorWidth,dragStartBehavior, andclipBehaviornow correctly fall back tothis.xxxinstead of overriding with hardcoded defaults
-
7.9.106 Mar 2026Release notes
Open source →Fixed
- Form submit button not calling
onSubmit- FixedButtonStatepassingNyFormData.stateName(already prefixed withform_) toNyFormWidget.submit(), which added the prefix again resulting inform_form_FormName. Now correctly passesNyFormData.nameso the state name resolves properly
- Form submit button not calling
-
7.9.005 Mar 2026Release notes
Open source →Added
- Data-aware toast notification styles - Toast styles can now receive dynamic data at call time via a new
ToastStyleDataFactorytypedef. Register data-aware styles withregisterWithData()or pass both static and data-aware factories toregisterAll()andaddToastNotifications() dataparameter for toast helpers - Added optionaldataparameter toshowToastNotification(),NyBaseState.showToast(),NyBaseState.showToastCustom(),NyController.showToastCustom(), andStateAction.showToastCustom()to pass custom key-value pairs to data-aware toast stylesToastNotificationRegistry.resolve()- New method that resolves a toast style by ID and passes data to data-aware factories, replacing directget()calls internallyenablePullDownparameter forCollectionView- AddedenablePullDownoption to allCollectionViewconstructors (.list,.separated,.grid,.pullable,.pullableSeparated,.pullableGrid) to control whether pull-to-refresh is enabled
Changed
- Renamed API pagination parameters -
queryParamPagerenamed toparamPageandqueryParamPerPage/queryNamePerPagerenamed toparamPerPageinnyApi()andapi()helpers for consistency NyFormWidgetstate methods usestateAction()- RefactoredstateSetValue(),stateSetOptions(),clearField(), andsubmit()to usestateAction()instead ofupdateState()for cleaner form state management
- Data-aware toast notification styles - Toast styles can now receive dynamic data at call time via a new
-
7.8.104 Mar 2026Release notes
Open source →Changed
- Updated dependency constraints:
dio^5.9.2,skeletonizer^2.1.3,error_stack^2.0.1,app_badge_plus^1.2.7,uuid^4.5.3,characters^1.4.1,ffi^2.2.0,patrol^4.1.1
- Updated dependency constraints:
-
7.8.003 Mar 2026Release notes
Open source →Added
NavigationHubStateActions.refreshTab()- Refresh a specific tab by index, forcing it to rebuild with a newUniqueKeyNavigationHubStateActions.refresh()- Refresh all tabs in the navigation hub, forcing them all to rebuildrootNavigatorparameter forpop()- AddedrootNavigatoroption toNyBaseState.pop(),NyController.pop(),StateAction.pop(), andBuildContext.pop()to support popping from the root navigator when using nested navigation
-
7.7.102 Mar 2026Release notes
Open source →Fixed
ArgumentsWrapperJSON serialization crash - Route arguments containing non-serializable objects (e.g. model instances, enums) would throw aJsonUnsupportedObjectErrorwhen Flutter'sNavigatorStatecalledjsonEncodeduring state restoration or post-navigation logging. A new_safeEncode()helper now recursively converts non-primitive values to safe representations before encoding- Missing
toJson()onArgumentsWrapper- AddedtoJson()method required by Flutter'sNavigatorStatefor JSON encoding route arguments
-
7.7.001 Mar 2026Release notes
Open source →Added
Field.builderconstructor - New constructor that lets developers create custom form fields inline using a builder function, without needing to subclassNyFieldStatefulWidget. IncludesNyFormBuilderwidget andFormBuilderStateActionswithclearandsetValuesupportFormValidator.nullable()method - Mark a validator as nullable so that null or empty values automatically pass validation; non-empty values still have all rules appliedLanguageSwitcherAnimationStyle- New configuration class for controlling animations on theLanguageSwitcherinline popup trigger and bottom modal list items, with preset factories:none(),subtle(),bouncy(), andfadeIn()useRootNavigatorparameter forLanguageSwitcher.showBottomModal- Allows the bottom modal to be presented above all navigators when using nested navigation
Fixed
InputFieldautocorrectproperty not forwarded - Theautocorrectparameter was accepted by the widget but never passed to the underlyingTextField
Changed
- Simplified
NyFormPickerselected value layout from aStackwithPositionedwidgets to aColumn, improving readability and consistency LanguageSwitcherinline popup now supports trigger scale animation, popup content fade-in via_PopupContentFade, and configurable animation durations and curves for list item transitions
-
7.6.026 Feb 2026Release notes
Open source →Added
Backpack.read<T>()Map deserialization - When a value stored in the Backpack is a rawMap<String, dynamic>(e.g. fromsyncKeys), callingread<T>()with a typed parameter now automatically deserializes it into the corresponding model and caches the result for subsequent reads- Loading indicator for
LanguageSwitcherlist items - Tapping a language inLanguageSwitcher.showBottomModalnow displays aCircularProgressIndicatoron the selected item while the language switch processes, providing clear visual feedback
Fixed
CollectionViewfindChildIndexCallbackrenamed tofindItemIndexCallback- Updated theListView.separatedbuilder to use the renamed Flutter SDK parameter, fixing compatibility with recent Flutter versionsLanguageSwitchermodal not closing immediately on selection - Movednavigator.pop()to execute beforestoreLanguageandonLanguageChangeso the bottom sheet dismisses instantly rather than waiting for async operations to complete
Changed
- Replaced
T.toString() != 'dynamic'and_isType<T, U>()helper calls with directT != dynamic/T == Typecomparisons inBackpackandNyStoragefor cleaner, more idiomatic type checking - Changed
_LanguageListItem.onTaptype fromVoidCallbacktoFuture<void> Function()to support async tap handling with loading state
-
7.5.021 Feb 2026Release notes
Open source →Added
contentPaddingandactionsPaddingforNyBaseModal.show()andNyModalLayout- New optional padding parameters that allow fine-grained control over the modal's content area and actions section spacing
Fixed
FieldStyleTextField.password()suffixIcon always rendered - The password field style factory now conditionally sets the visibility toggle icon based onpasswordViewable, returningnullwhen disabled instead of always rendering a non-functionalIconButtonInputFieldsuffixIcon overriding password toggle - CustomsuffixIconis now only applied whenpasswordViewableis not true, preventing it from replacing the password visibility toggle button
Changed
- Removed hardcoded English default titles from toast notification methods (
showToastSorry,showToastWarning,showToastInfo,showToastDanger,showToastOops,showToastSuccess,showToastCustom). Thetitleparameter now passes through as-is, allowing the toast notification registry to handle default titles consistently with the i18n approach
-
7.4.014 Feb 2026Release notes
Open source →Added
onLanguageChangecallback forLanguageSwitcher.showBottomModal- New optional callback parameter that fires when the user selects a different language, providing the selected language key
Fixed
LanguageSwitcher.showBottomModalfuture completing immediately - Added missingreturnbeforeshowModalBottomSheetso the method's future now correctly waits for the modal to close before completing
-
7.3.114 Feb 2026Release notes
Open source →Fixed
- App lifecycle not assigned in
Nylo.init()- TheappLifecycleparameter was accepted but never assigned to_appLifecycle, causingnylo.appLifecycleStatesto always return null. Now correctly assigns the value during initialization
Changed
- Removed unused
_formCastsfield and related methods (addFormCasts,getFormCasts) from theNyloclass - Removed unused
formCastsparameter fromNylo.configure() - Updated
flutter_local_notificationsconstraint to^20.1.0 - Updated
timezoneconstraint to^0.10.0
- App lifecycle not assigned in
-
7.3.014 Feb 2026Release notes
Open source →Added
- Localization fallback locale support - When a translation key is missing in the current locale,
NyLocalizationnow automatically falls back to the default language before returning the raw key. Supports both top-level and nested (dot-notated) keys NyLocalization.setValuesForTesting()- New test helper method for directly setting translation values and fallback values in unit tests
Fixed
- Date formatting initialization - Added
initializeDateFormatting()call inNylo.init()to ensure all locale-specific date format data is available, preventing failures when formatting dates in non-default locales - Modal keyboard overlap -
NyBaseModalnow applies bottom padding matchingMediaQuery.viewInsets.bottomwhenisScrollControlledis true, preventing the on-screen keyboard from covering modal content
- Localization fallback locale support - When a translation key is missing in the current locale,
-
7.2.012 Feb 2026Release notes
Open source →Added
FieldDefinitionclass anddefine()helper - Set both a value and options for form fields inNyFormWidget.init, enabling deferred option loading from APIsPickerListTileStyle- Style configuration for picker bottom sheet list tiles withradio,checkmark, andcustombuilder presets viaPickerListTileIndicatorFieldStylePickeralignment properties - AddedplaceholderAlignment,selectedValueAlignment, andselectedValuePaddingfor fine-grained picker layout controlFieldStyleDateTimePickerclear controls - AddedcanClearandclearIconDataproperties to control date/time field clearing behaviorFieldStyleSwitchBoxextended properties - AddedactiveTrackColor,inactiveThumbColor,inactiveTrackColor,thumbColor,trackColor,trackOutlineColor,thumbIcon,dragStartBehavior, and thumb image propertiesInputFieldsuffixIcon support - AddedsuffixIconparameter across allInputFieldconstructors andcopyWithStyledText.templatekey:text syntax - New{{key:text}}placeholder syntax for localization-friendly styled text where the display text is separate from the style lookup keyFormCollection.empty()constructor - New const constructor for empty form collections, useful as a default for fields with deferred optionsField.datetime/Field.datedirect parameters - AddedfirstDate,lastDate,dateFormat, andinitialPickerDateTimedirectly on field constructorsField.picker/Field.radio/Field.chipsoptional options - Theoptionsparameter is no longer required; defaults toFormCollection.empty()for deferred loading viadefine()- New
styled_text_test.darttest suite forStyledText.templatewith key:text and pipe-key syntax
Fixed
- NavigationHub unselected label styling - Now applies
unselectedLabelStyleandunselectedItemColorto inactive tabs - NavigationHub activeIcon fallback - Falls back to
page.value.iconbefore text widget when noactiveIconis set - Form field state actions (picker, chips, radio) - Changed
setValuetorestoreValuein clear/setValue actions to prevent redundant UI update cycles NyResponse.ifSuccessful/whennull safety - Fixed type promotion with local variable for proper null-safetyField.currencyinitial value - Now usesdummyDataas fallback for initial value whenvalueis nullInputFieldformat-on-init - Initial text values now pass through input formatters so programmatic values (e.g. fromdefine()) display formattedInputFieldsetValue with formatters - ThesetValuestate action now applies input formatters to the value
Changed
- Added
WidgetsFlutterBinding.ensureInitialized()toNylo.configure()to ensure binding before configuration - Added explicit return types and
dynamicparameter types across multiple methods for lint compliance - Removed global analyzer ignores for
non_constant_identifier_namesandcamel_case_typesfromanalysis_options.yaml; moved to targetedignore_for_filecomments - Validation
errorResponsesnow useswhereType<FormValidationError>()instead ofwhere().cast() - Updated test suite for Flutter Color API changes (
.r/.g/.b/.a/.toARGB32()) - Documentation comment fixes for escaped generic types in dartdoc
-
7.1.010 Feb 2026Release notes
Open source →Added
- Namespaced translation keys - All hardcoded English strings in widgets now use namespaced translation keys for better i18n support. Keys added:
nylo.page_not_found.title,nylo.page_not_found.message,nylo.page_not_found.go_backnylo.collection_view.no_results,nylo.collection_view.pull_up,nylo.collection_view.failed,nylo.collection_view.releasenylo.offline_banner.messagenylo.form_picker.select,nylo.form_picker.clearnylo.language_switcher.titlenylo.journey.of,nylo.journey.step,nylo.journey.back,nylo.journey.next,nylo.journey.finishnylo.confirm_action.cancel,nylo.confirm_action.confirm
- NyBaseModal enhancements - Added
useRootNavigatorandmodalBackgroundColorparameters toNyBaseModal.show()andNyModalLayout - InputField multiline improvements - Auto-sets
alignLabelWithHintandtextAlignVerticalfor multiline fields; passes throughprefixIconConstraintsfrom decoration - Exported
CustomAnimationBuilderfromflutter_styled_toastviany_core.dart
Changed
- Event system parameter renamed from
paramstodataacrossNyListener,NyEventBus,NyEventCallbackListener, andNyEventExtensionfor clarity DioApiService.handleResponsenow conditionally skips data morphing whenhandleSuccessorhandleFailurecallbacks are provided, and properly returns callback resultsDioApiServicecaching logic fixed to avoid null reference when saving cached responsesNyBaseModal.show()default foruseSafeAreachanged fromtruetofalseJourneyContentusesExpandedinstead ofFlexiblefor main content area- Replaced
ny_metro.dartimports withcollectionpackage inInputFieldandLanguageSwitcher - Added
collectionpackage dependency (^1.19.1)
- Namespaced translation keys - All hardcoded English strings in widgets now use namespaced translation keys for better i18n support. Keys added:
-
7.0.006 Feb 2026Release notes
Open source →Breaking Changes
- Complete library restructuring - All modules have been reorganized from flat file layouts into
src/subdirectories with barrel file exports. Import paths have changed across the entire library:lib/alerts/files moved tolib/alerts/src/with barrelny_alerts.dartlib/controllers/files moved tolib/controllers/src/with barrelny_controllers.dartlib/event_bus/files moved tolib/event_bus/src/with barrelny_event_bus.dartlib/events/files moved tolib/events/src/with barrelny_events.dartlib/helpers/files moved tolib/helpers/src/with barrelny_helpers.dartlib/local_notifications/files moved tolib/local_notifications/src/with barrelny_local_notifications.dartlib/local_storage/files moved tolib/local_storage/src/with barrelny_local_storage.dartlib/localization/files moved tolib/localization/src/with barrelny_localization.dartlib/metro/files moved tolib/metro/src/with barrelny_metro.dartlib/networking/files moved tolib/networking/src/with barrelny_networking.dartlib/providers/files moved tolib/providers/src/with barrelny_providers.dartlib/router/files moved tolib/router/src/with barrelny_router.dartlib/themes/files moved tolib/themes/src/with barrelny_themes.dartlib/widgets/files moved tolib/widgets/src/with barrelny_widgets.dartlib/dart_console/reorganized with barrelny_dart_console.dart
- New unified entry point -
lib/ny_core.dartexports all modules in one import - Nylo.init() signature changed - Now requires
envparameter asEnvGettertype and acceptsBootConfigfor setup. ThesetupandsetupFinishedcallbacks have been replaced by theBootConfigclass pattern - NyEnvRegistry introduced - Environment variables are now managed through
NyEnvRegistry.register(getter: Env.get)instead of reading.envfiles directly - Theme system rewritten - Replaced
theme_providerpackage with newNyThemeManagersingleton,NyThemeProviderwidget, andNyThemeStoragefor persistence. Theme registration now usesnylo.addThemes()with optionalinitialThemeIdparameter - Removed
BaseColorStyles- Replaced byThemeColorabstract class inlib/themes/src/theme_color.dart - Widget renames:
NyRichTextrenamed toStyledText(withStyledText.template()constructor)NyTextFieldrenamed toInputFieldNyFutureBuilderrenamed toFutureWidgetNyFaderrenamed toFadeOverlay(with.top(),.bottom(),.left(),.right()constructors)NyPullToRefreshandNyListViewconsolidated intoCollectionView(withCollectionItemwrapper class)NyPullablerenamed toPullableNyLanguageSwitcherrenamed toLanguageSwitcher
- Removed
NyTextStyle- No longer part of the library - Removed
ValidationException- Validation exceptions moved to form-specific handling - Removed
NyLoginForm- Replaced by generalNyFormcapabilities - Removed
events.dart- Events now use dedicatedny_events.dartbarrel with new architecture - Removed
router.dart- Router now uses dedicatedny_router.dartbarrel - Removed
dart_console.dart- Dart console now uses dedicatedny_dart_console.dartbarrel - Removed
validation/directory - Validation rules (ny_validator.dart,rules.dart,validations.dart) have been moved into the form system - Minimum Dart SDK raised to
^3.10.7 - Minimum Flutter version raised to
>=3.24.0
Added
- Nylo Testing Framework (
lib/testing/) - A comprehensive testing framework with PHPUnit/Pest-like syntax:NyTest- Main test orchestrator withinit(),actingAs(),travel(),travelForward(),travelBack(),freezeTime(),dump(),dd()methodsNyWidgetTest- Widget testing utilities withpumpNyWidget()andpumpNyWidgetSimple()for easy widget testingNyTime- Time manipulation for testing (freeze, advance, rewind)NyFactory/NyFaker- Laravel-style model factories for generating test dataNyMockApi- API mocking with type-based handlers and URL pattern matching (supports*and**wildcards)NyMockChannels- Platform channel mocking for testsNyMockRouteGuard- Route guard mockingNyTestCache- In-memory cache for testsNyStateTestHelpers- State testing helpers- Pest-style test functions:
nyTest(),nyGroup(),nyWidgetTest(),nySetUp(),nyTearDown(),nySetUpAll(),nyTearDownAll(),nySkip(),nyFailing(),nyCi() - Custom assertions:
expectAuthenticated(), route assertions, backpack assertions, locale assertions - Automatic Google Fonts HTTP request disabling in tests
- NyConnectivity (
lib/helpers/src/ny_connectivity.dart) - Network connectivity helper withisOnline(),isOffline(),isWifi(),isMobile(),isEthernet(),isVpn(),isBluetooth(),stream(),whenOnline(),when(),connectionTypeString() - Connective widget (
lib/widgets/src/connective.dart) - Reactive widget that rebuilds based on connectivity state. IncludesConnective.builder(),OfflineBannerwidget, and widget extensions.connectiveOr(),.onlyOnline(),.onlyOffline() - NyEnvRegistry (
lib/helpers/src/ny_env.dart) - New centralized environment variable management withregister(),get(),containsKey(),isInitialized - BootConfig (
lib/providers/src/providers.dart) - New configuration class for bootstrapping Nylo applications withsetupandbootlifecycle functions - ButtonAnimationStyle (
lib/helpers/src/button_animation_style.dart) - Composable button animation styles:clickable(Duolingo-style 3D press),bounce,pulse,squeeze,jelly,shine,ripple,morph,shake - ButtonSplashStyle (
lib/helpers/src/button_splash_style.dart) - Customizable button splash effects:ripple,highlight,glow,ink,none,custom - AnimatedButtonWrapper widget (
lib/widgets/src/animated_button_wrapper.dart) - NyBaseModal (
lib/widgets/src/ny_base_modal.dart) - Base class for creating modal bottom sheets with customizable layouts, headers, action rows/columns, close buttons, and drag handles - NyResponse (
lib/networking/src/models/ny_response.dart) - Enhanced API response class withisSuccessful,isClientError,isServerError,isRedirect,isUnauthorized,isForbidden,isNotFound,isTimeout,isRateLimited,dataOrThrow(),dataOr(),ifSuccessful(),when(),errorMessage - CachePolicy (
lib/networking/src/models/cache_policy.dart) - API request caching strategies:networkOnly,cacheFirst,networkFirst,cacheOnly,staleWhileRevalidate - NetworkLogger (
lib/networking/src/interceptors/network_logger.dart) - New Dio interceptor with log levels (verbose, minimal, none), color terminal output, structured JSON output, and UUID-based request ID tracking - HasApiService mixin (
lib/helpers/src/mixins/api_service.dart) - Mixin for classes that need typed API service access withonApiSuccess()andonApiError()callbacks - NyThemeManager (
lib/themes/src/ny_theme_manager.dart) - Singleton theme manager with reactive updates viathemeNotifier, system theme following, theme change stream, typed color styles, multi-theme support with preferred themes - NyThemeProvider (
lib/themes/src/ny_theme_provider.dart) - Widget providing theme context withAnimatedThemefor smooth transitions - NyThemeStorage (
lib/themes/src/ny_theme_storage.dart) - Secure storage for theme persistence including preferred light/dark theme IDs and follow-system preference - openUrl() / canOpenUrl() (
lib/helpers/src/ny_url.dart) - URL launching helpers withUrlLaunchModeTypeenum (externalApplication, inAppWebView, inAppBrowserView, platformDefault) - FadeOverlay widget - Replaces NyFader with directional constructors:
FadeOverlay.top(),.bottom(),.left(),.right()and configurablestrengthparameter - CollectionItem wrapper class - Provides
isFirst,isLast,isEven,isOdd,index,totalItemshelpers for list items in CollectionView - StyledText.template() constructor - Template-based rich text with
{{placeholder}}syntax and pipe-separated style groups - Storage exception hierarchy (
lib/local_storage/src/storage_exceptions.dart) -StorageException,StorageSerializationException,StorageDeserializationException,StorageKeyNotFoundException,StorageTimeoutException - Form field additions - New
FormSliderandFormRangeSliderform fields, newFormTextFieldfield, newFieldStyleconfiguration class - Dart Console spinner (
lib/dart_console/src/spinner.dart) - New spinner component for CLI output - Nylo.configure() method - Single-call configuration for all Nylo settings (loader, logo, themes, toastNotifications, modelDecoders, controllers, apiDecoders, events, formCasts, authKey, syncKeys, errorStack, localization, and more)
- Nylo.getService() / Nylo.hasService() - Service locator pattern for registered
Runnableservices - Nylo.wipeStorage() - Renamed from
wipeAllStorageData()with addedexcludeKeysparameter - Nylo.containsRoute() (singular) - Convenience method alongside existing
containsRoutes() - Nylo.user() - Static method to get the authenticated user
- Nylo.authKey() - Static method to get the configured auth storage key
- Nylo.isTestMode flag - Static flag to indicate test mode, skipping timezone configuration and using in-memory cache
- Service lifecycle support in
Nylo.init()- Services parameter acceptingList<FutureOr<Runnable>>with three lifecycle phases:onInit(),onReady(),onAppReady() - useDevPanelLogging() - Integration hooks for external dev panel logging with
onLogandonRouteChangecallbacks - NyApp widget (
lib/widgets/src/ny_app.dart) - New app-level widget - TextTr widget (
lib/widgets/src/text_tr.dart) - Text widget with built-in translation support - RouteMatcher (
lib/router/src/route_matcher.dart) - Dedicated route matching utility - RouterFunctions (
lib/router/src/router_functions.dart) - Extracted router utility functions - NyNavigator (
lib/router/src/ny_navigator.dart) - Extracted navigator class - BottomNavStyle (
lib/widgets/src/navigation_hub/bottom_nav_style.dart) - Navigation hub bottom nav styling - Comprehensive test suite added across all modules (
test/alerts/,test/controllers/,test/core/,test/dart_console/,test/event_bus/,test/events/,test/helpers/,test/local_notifications/,test/local_storage/,test/localization/,test/metro/,test/networking/,test/providers/,test/router/,test/testing/,test/themes/,test/widgets/)
Changed
- Nylo.init() now accepts
env: EnvGetter(required),setup: BootConfig?,appLifecycle, andservicesparameters - Toast notifications now use a registry pattern with
ToastNotificationRegistryandToastStyleFactory- configure vianylo.addToastNotifications() - Local storage split into focused modules:
StorageConfig,StorageManager,StorageUtils,StorageHelpers, andNyStorage - Local notifications restructured with dedicated configuration classes:
AndroidNotificationConfig,IOSNotificationConfig,LocalNotification,NotificationAttachment,NotificationException - Events system refactored into:
NyEventinterface,EventBus,EventSubscription, event extensions, andListener NyLoggernow supportsonLogcallback for external logging integrationNyRouteHistoryObservernow supportsonRouteChangecallback for external route tracking- Theme persistence migrated from SharedPreferences to FlutterSecureStorage
NyLocalizationrefactored withNyLocalizationConfigclass for configuration- Updated
service_runnerdependency - Updated
flutter_local_notificationsto ^20.0.0 - Updated
connectivity_plusto ^7.0.0 - Updated various other dependencies to latest versions
pubspec.yamlrepository URL updated to7.xbranchpubspec.yamlSDK constraint updated to^3.10.7- Added
patrolas dev dependency for widget testing - Updated logo/screenshot
Removed
- Removed
theme_providerpackage dependency - replaced by built-inNyThemeManager/NyThemeProvider - Removed
pretty_dio_loggerpackage dependency - replaced by built-inNetworkLoggerinterceptor - Removed
lib/validation/directory (ny_validator.dart, rules.dart, validations.dart) - Removed
lib/exceptions/validation_exception.dart - Removed
lib/forms/ny_login_form.dart - Removed
lib/helpers/ny_text_style.dart - Removed
lib/widgets/styles/ny_radio_tile_style.dart - Removed flat-file exports that have been replaced by barrel files (e.g.,
lib/events/events.dart,lib/router/router.dart,lib/dart_console/dart_console.dart,lib/providers/providers.dart,lib/local_storage/local_storage.dart,lib/local_notifications/local_notifications.dart,lib/localization/app_localization.dart,lib/networking/ny_base_api_service.dart)
- Complete library restructuring - All modules have been reorganized from flat file layouts into
-
6.38.113 Dec 2025Nothing published for this version
-
6.38.014 Nov 2025Nothing published for this version
-
6.37.028 Oct 2025Nothing published for this version
-
6.36.012 Oct 2025Nothing published for this version
-
6.35.222 Sep 2025Nothing published for this version
-
6.35.106 Sep 2025Nothing published for this version
-
6.35.018 Jul 2025 -
6.34.017 Jul 2025Release notes
Open source →- Added
lifecycleActionstoNylo.init. This will allow you to global handle your app's lifecycle. - Add missing annotations
- Update pubspec.yaml
- Added
-
6.33.014 Jul 2025Release notes
Open source →- Added
lifecycleActionstoNyPage. This will allow you to handle lifecycle events in your pages. - Update pubspec.yaml
- Added
-
6.32.002 Jul 2025Release notes
Open source →- Added
excludeKeystoNyStorage.deleteAll. This will allow you to exclude certain keys from being deleted when callingdeleteAll. - Added
hasExecutedTaskOncein NyScheduler. This will allow you to check if a task has been executed. - Update pubspec.yaml
- Added
-
6.31.024 Jun 2025Release notes
Open source →- Added
setto NySession class. This will allow you to set a value in the session. - Added
onFailureparameter to isSuccessful method inNyValidator. - Fix
getInitialRouteNameto return the correct initial route name when,whenis used.
- Added