PackageTrack
Sign in Get early access

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 2026
2022 2023 2024 2025 2026
Release Pre-release

Releases

latest 60 of 270
  1. 7.28.0 21 Aug 2026
    Release notes

    Added

    • name and path constructor parameters on NavigationHub - NavigationHub(this.pages, {super.name, super.path}) forwards both to NyPage, so a hub can declare the state name it is addressed by. This lets a hub and the NavigationHubStateActions that drive it agree on one name, e.g. MyHub({super.key}) : super(child: () => _MyHubState(), stateName: path.stateName()); alongside static NavigationHubStateActions stateActions = NavigationHubStateActions(path.stateName());
    • NyStatefulWidget.declaredStateName - Holds the stateName passed to the constructor, when one was given. The existing state member becomes a computed getter that returns declaredStateName when set and otherwise derives the name from the widget's own class, so the name a widget listens on is always available even where no stateName was 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 the RouteView signature - 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.error now 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 via super(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() and previousPage() now report once, via NyLogger.error, when no hub is listening on the name they address, detected from the absence of the ${state}_current_tab key a hub writes as the first thing its init does. 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, updateState with a RouteView, 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 a RouteView, which knows the widget it builds and nothing about the state behind it. For the naming convention Metro scaffolds (MyPage with _MyPageState) the resulting name is unchanged; a state class named outside that convention now resolves to Closure: () => _${WidgetClass}State on both ends rather than to its own class name
    • NyState points its controller at the page it is used from - _controller.state is now assigned the resolved stateName on every initState, rather than only when it still held the initial "/". A controller registered as a singleton is shared by every page that asks for it, so controller.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 --obfuscate renames 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 through element.event.runtimeType.toString() != 'UpdateState', a comparison against a class name that obfuscation rewrites; it now tests event is! UpdateState and reads the event's data field rather than props[1]
    • NyPage adopting another page's state data on init - Restoring from the event bus history took the last UpdateState entry regardless of which state it was sent to, so a page could open holding a payload addressed to a different page. The lookup now matches stateName before taking the most recent entry
    • JourneyState.isLastStep reporting the last step where a journey has no steps - With totalSteps at 0 the comparison read 0 >= -1 and answered true, so a step whose hub data had not been read yet was treated as the end of the journey. The getter now requires totalSteps > 0
    Open source →
    Release notes

    Added

    • name and path constructor parameters on NavigationHub - NavigationHub(this.pages, {super.name, super.path}) forwards both to NyPage, so a hub can declare the state name it is addressed by. This lets a hub and the NavigationHubStateActions that drive it agree on one name, e.g. MyHub({super.key}) : super(child: () => _MyHubState(), stateName: path.stateName()); alongside static NavigationHubStateActions stateActions = NavigationHubStateActions(path.stateName());
    • NyStatefulWidget.declaredStateName - Holds the stateName passed to the constructor, when one was given. The existing state member becomes a computed getter that returns declaredStateName when set and otherwise derives the name from the widget's own class, so the name a widget listens on is always available even where no stateName was 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 the RouteView signature - 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.error now 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 via super(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() and previousPage() now report once, via NyLogger.error, when no hub is listening on the name they address, detected from the absence of the ${state}_current_tab key a hub writes as the first thing its init does. 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, updateState with a RouteView, 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 a RouteView, which knows the widget it builds and nothing about the state behind it. For the naming convention Metro scaffolds (MyPage with _MyPageState) the resulting name is unchanged; a state class named outside that convention now resolves to Closure: () => _${WidgetClass}State on both ends rather than to its own class name
    • NyState points its controller at the page it is used from - _controller.state is now assigned the resolved stateName on every initState, rather than only when it still held the initial "/". A controller registered as a singleton is shared by every page that asks for it, so controller.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 --obfuscate renames 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 through element.event.runtimeType.toString() != 'UpdateState', a comparison against a class name that obfuscation rewrites; it now tests event is! UpdateState and reads the event's data field rather than props[1]
    • NyPage adopting another page's state data on init - Restoring from the event bus history took the last UpdateState entry regardless of which state it was sent to, so a page could open holding a payload addressed to a different page. The lookup now matches stateName before taking the most recent entry
    • JourneyState.isLastStep reporting the last step where a journey has no steps - With totalSteps at 0 the comparison read 0 >= -1 and answered true, so a step whose hub data had not been read yet was treated as the end of the journey. The getter now requires totalSteps > 0
    Open source →
  2. 7.27.5 18 Aug 2026
    Release notes

    Changed

    • Bumped intl from ^0.20.2 to ^0.20.3, flutter_local_notifications from ^22.2.0 to ^22.3.0, app_badge_plus from ^1.3.2 to ^1.3.4, win32 from ^6.3.0 to ^6.4.0, and patrol (dev) from ^4.8.0 to ^4.9.0 - routine compatibility refreshes
    • Excluded platform build output directories (build/, android/, ios/, web/, windows/, macos/, linux/) from static analysis in analysis_options.yaml - keeps the analyzer focused on the package's Dart sources

    Fixed

    • MetroService.discoverCustomCommands returning an unawaited Future inside its try block - an asynchronous failure from discoverCommands would escape the surrounding catch instead of surfacing the "Error loading custom commands" console message; the return is now awaited in lib/metro/src/metro_service.dart
    • CollectionView passing the deprecated cacheExtent parameter to its internal ListViews - Flutter deprecated cacheExtent in favour of scrollCacheExtent after v3.41.0-0.0.pre. The three list builders in lib/widgets/src/collection_view.dart now pass scrollCacheExtent, converting the widget's double? cacheExtent to ScrollCacheExtent.pixels(...) - the same pixel semantics as before, so the public CollectionView.cacheExtent API is unchanged
    Open source →
    Release notes

    Changed

    • Bumped intl from ^0.20.2 to ^0.20.3, flutter_local_notifications from ^22.2.0 to ^22.3.0, app_badge_plus from ^1.3.2 to ^1.3.4, win32 from ^6.3.0 to ^6.4.0, and patrol (dev) from ^4.8.0 to ^4.9.0 - routine compatibility refreshes
    • Excluded platform build output directories (build/, android/, ios/, web/, windows/, macos/, linux/) from static analysis in analysis_options.yaml - keeps the analyzer focused on the package's Dart sources

    Fixed

    • MetroService.discoverCustomCommands returning an unawaited Future inside its try block - an asynchronous failure from discoverCommands would escape the surrounding catch instead of surfacing the "Error loading custom commands" console message; the return is now awaited in lib/metro/src/metro_service.dart
    • CollectionView passing the deprecated cacheExtent parameter to its internal ListViews - Flutter deprecated cacheExtent in favour of scrollCacheExtent after v3.41.0-0.0.pre. The three list builders in lib/widgets/src/collection_view.dart now pass scrollCacheExtent, converting the widget's double? cacheExtent to ScrollCacheExtent.pixels(...) - the same pixel semantics as before, so the public CollectionView.cacheExtent API is unchanged
    Open source →
  3. 7.27.4 02 Aug 2026
    Release notes

    Changed

    • Bumped dio from ^5.10.0 to ^5.11.0, connectivity_plus from ^7.2.0 to ^7.3.1, flutter_local_notifications from ^22.0.1 to ^22.2.0, uuid from ^4.5.3 to ^4.6.0, app_links from ^7.2.0 to ^7.2.1, app_badge_plus from ^1.3.1 to ^1.3.2, get_time_ago from ^2.4.0 to ^2.4.1, error_stack from ^2.1.4 to ^2.1.5, and patrol (dev) from ^4.6.1 to ^4.8.0 - routine compatibility refreshes
    Open source →
    Release notes

    Changed

    • Bumped dio from ^5.10.0 to ^5.11.0, connectivity_plus from ^7.2.0 to ^7.3.1, flutter_local_notifications from ^22.0.1 to ^22.2.0, uuid from ^4.5.3 to ^4.6.0, app_links from ^7.2.0 to ^7.2.1, app_badge_plus from ^1.3.1 to ^1.3.2, get_time_ago from ^2.4.0 to ^2.4.1, error_stack from ^2.1.4 to ^2.1.5, and patrol (dev) from ^4.6.1 to ^4.8.0 - routine compatibility refreshes
    Open source →
  4. 7.27.3 06 Jul 2026
    Release notes

    Changed

    • Re-tightened collection from ^1.18.0 to ^1.19.1 and characters from ^1.4.0 to ^1.4.1 - both packages are vendored by the Flutter SDK, and the >=3.44.0 floor adopted in 7.27.2 ships collection 1.19.1 and characters 1.4.1, so the constraints now match the versions the minimum supported Flutter provides
    • Bumped dio from ^5.9.2 to ^5.10.0, connectivity_plus from ^7.1.1 to ^7.2.0, app_links from ^7.1.1 to ^7.2.0, equatable from ^2.0.8 to ^2.1.0, get_time_ago from ^2.3.2 to ^2.4.0, flutter_local_notifications from ^22.0.0 to ^22.0.1, path_provider from ^2.1.5 to ^2.1.6, timezone from ^0.11.0 to ^0.11.1, and app_badge_plus from ^1.3.0 to ^1.3.1 - routine compatibility refreshes
    Open source →
    Release notes

    Changed

    • Re-tightened collection from ^1.18.0 to ^1.19.1 and characters from ^1.4.0 to ^1.4.1 - both packages are vendored by the Flutter SDK, and the >=3.44.0 floor adopted in 7.27.2 ships collection 1.19.1 and characters 1.4.1, so the constraints now match the versions the minimum supported Flutter provides
    • Bumped dio from ^5.9.2 to ^5.10.0, connectivity_plus from ^7.1.1 to ^7.2.0, app_links from ^7.1.1 to ^7.2.0, equatable from ^2.0.8 to ^2.1.0, get_time_ago from ^2.3.2 to ^2.4.0, flutter_local_notifications from ^22.0.0 to ^22.0.1, path_provider from ^2.1.5 to ^2.1.6, timezone from ^0.11.0 to ^0.11.1, and app_badge_plus from ^1.3.0 to ^1.3.1 - routine compatibility refreshes
    Open source →
  5. 7.27.2 07 Jun 2026
    Release notes

    Changed

    • Bumped flutter_local_notifications from ^21.0.0 to ^22.0.0 - the v22 line ships a dedicated web implementation (the new flutter_local_notifications_web) and advances the platform interface to 12.0.0
    • Bumped app_links from ^7.0.0 to ^7.1.1, flutter_timezone from ^5.0.2 to ^5.1.0, app_badge_plus from ^1.2.10 to ^1.3.0, flutter_secure_storage from ^10.3.0 to ^10.3.1, and patrol (dev) from ^4.6.0 to ^4.6.1 - routine compatibility refreshes
    • Raised the environment constraints to sdk: ^3.12.0 and flutter: ">=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
    Open source →
    Release notes

    Changed

    • Bumped flutter_local_notifications from ^21.0.0 to ^22.0.0 - the v22 line ships a dedicated web implementation (the new flutter_local_notifications_web) and advances the platform interface to 12.0.0
    • Bumped app_links from ^7.0.0 to ^7.1.1, flutter_timezone from ^5.0.2 to ^5.1.0, app_badge_plus from ^1.2.10 to ^1.3.0, flutter_secure_storage from ^10.3.0 to ^10.3.1, and patrol (dev) from ^4.6.0 to ^4.6.1 - routine compatibility refreshes
    • Raised the environment constraints to sdk: ^3.12.0 and flutter: ">=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
    Open source →
  6. 7.27.1 02 Jun 2026
    Release notes

    Fixed

    • NetworkLogger crashing the Flutter tool's log reader on multi-byte characters - The interceptor wrapped long request/response lines with String.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 via package:characters, keeping emoji - along with composed sequences like flags and ZWJ emoji - whole. This affects both _printBlock and the key/value pretty-printer in lib/networking/src/interceptors/network_logger.dart
    Open source →
    Release notes

    Fixed

    • NetworkLogger crashing the Flutter tool's log reader on multi-byte characters - The interceptor wrapped long request/response lines with String.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 via package:characters, keeping emoji - along with composed sequences like flags and ZWJ emoji - whole. This affects both _printBlock and the key/value pretty-printer in lib/networking/src/interceptors/network_logger.dart
    Open source →
  7. 7.27.0 25 May 2026
    Release notes

    Added

    • Multi-instance NyStateManaged widgets - NyStateManaged now exposes a baseState (widget-type identifier) and an id (instance identifier) constructor parameter, plus a composed stateKey getter that resolves to baseState when id is 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 optional id argument; when state is a String and id is supplied, the dispatch key becomes "${state}_$id", delivering the action to the matching NyStateManaged instance only
    • name constructor parameter on NyBaseState, NyState, NyPage, and JourneyState - Provides an explicit state-name override. When set it takes precedence over the existing path argument (stateName = name ?? path). NyState.initState additionally adopts the parent NyStateManaged.stateKey as its stateName when the managed widget declares a baseState, so the routing key flows from the widget down to its state automatically

    Deprecated

    • NyStateManaged.stateName (constructor parameter and getter) - Superseded by id. The constructor still accepts stateName and forwards it to id (id = id ?? stateName), and the stateName getter now returns id, so existing call sites keep compiling. New code should pass baseState + id and read stateKey for the composed routing key
    Open source →
    Release notes

    Added

    • Multi-instance NyStateManaged widgets - NyStateManaged now exposes a baseState (widget-type identifier) and an id (instance identifier) constructor parameter, plus a composed stateKey getter that resolves to baseState when id is 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 optional id argument; when state is a String and id is supplied, the dispatch key becomes "${state}_$id", delivering the action to the matching NyStateManaged instance only
    • name constructor parameter on NyBaseState, NyState, NyPage, and JourneyState - Provides an explicit state-name override. When set it takes precedence over the existing path argument (stateName = name ?? path). NyState.initState additionally adopts the parent NyStateManaged.stateKey as its stateName when the managed widget declares a baseState, so the routing key flows from the widget down to its state automatically

    Deprecated

    • NyStateManaged.stateName (constructor parameter and getter) - Superseded by id. The constructor still accepts stateName and forwards it to id (id = id ?? stateName), and the stateName getter now returns id, so existing call sites keep compiling. New code should pass baseState + id and read stateKey for the composed routing key
    Open source →
  8. 7.26.2 23 May 2026
    Release notes

    Changed

    • Bumped error_stack from ^2.1.3 to ^2.1.4 - routine compatibility refresh
    Open source →
    Release notes

    Changed

    • Bumped error_stack from ^2.1.3 to ^2.1.4 - routine compatibility refresh
    Open source →
  9. 7.26.1 23 May 2026
    Release notes

    Changed

    • Bumped win32 from ^5.15.0 to ^6.3.0 - the v6 API tightens the FFI surface: console handles are now exposed as the typed HANDLE struct (with .value returning the raw int), SetConsoleMode accepts a CONSOLE_MODE wrapper around its mode bitmask, and CONSOLE_CURSOR_INFO.bVisible is a bool instead of a 0/1 integer. TermLibWindows (lib/dart_console/src/ffi/win/termlib_win.dart) has been updated for each of these: inputHandle/outputHandle are now HANDLE, populated via GetStdHandle(...).value; disableRawMode() wraps its bitmask in CONSOLE_MODE(...); disabledRawModeMask is now typed CONSOLE_MODE; and hideCursor/showCursor set bVisible = false/bVisible = true
    • Bumped app_links from ^6.3.2 to ^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_storage from ^10.0.0 to ^10.3.0, error_stack from ^2.1.2 to ^2.1.3, flutter_multi_formatter from ^2.13.10 to ^2.13.11, app_badge_plus from ^1.2.9 to ^1.2.10, and patrol from ^4.5.0 to ^4.6.0 - routine compatibility refreshes
    Open source →
    Release notes

    Changed

    • Bumped win32 from ^5.15.0 to ^6.3.0 - the v6 API tightens the FFI surface: console handles are now exposed as the typed HANDLE struct (with .value returning the raw int), SetConsoleMode accepts a CONSOLE_MODE wrapper around its mode bitmask, and CONSOLE_CURSOR_INFO.bVisible is a bool instead of a 0/1 integer. TermLibWindows (lib/dart_console/src/ffi/win/termlib_win.dart) has been updated for each of these: inputHandle/outputHandle are now HANDLE, populated via GetStdHandle(...).value; disableRawMode() wraps its bitmask in CONSOLE_MODE(...); disabledRawModeMask is now typed CONSOLE_MODE; and hideCursor/showCursor set bVisible = false/bVisible = true
    • Bumped app_links from ^6.3.2 to ^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_storage from ^10.0.0 to ^10.3.0, error_stack from ^2.1.2 to ^2.1.3, flutter_multi_formatter from ^2.13.10 to ^2.13.11, app_badge_plus from ^1.2.9 to ^1.2.10, and patrol from ^4.5.0 to ^4.6.0 - routine compatibility refreshes
    Open source →
  10. 7.26.0 21 May 2026
    Release notes

    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 new app_links dependency. Captured URIs are routed through the registered NyRouter; a path that is not registered routes to fallbackRoute when 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. Return true to let Nylo route automatically, or false to handle the URI yourself
    • NyDeepLinkHandler - Exported from router/ny_router.dart; encapsulates cold-start and warm-start URI capture and dispatch, with injectable AppLinks and dispatcher seams for testing

    Changed

    • Relaxed collection from ^1.19.1 to ^1.18.0 - collection is also vendored by the Flutter SDK; the looser floor removes the same class of resolution conflict as the characters fix below
    • Corrected the environment Flutter constraint from >=3.24.0 to >=3.38.4 - the previous value could not be satisfied alongside the sdk: ^3.10.7 Dart constraint (Flutter 3.24 ships Dart 3.5), so it now states the true minimum

    Deprecated

    • Nylo.onDeepLink(callback) - Superseded by Nylo.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() accessed stdout.supportsAnsiEscapes, which throws Unsupported operation on web because dart:io is unavailable in the browser. stdout access is now guarded behind a kIsWeb check
    • .dd() no longer throws UnsupportedError on Flutter web - the dd() ("dump and die") extensions on String, int, double, bool, Map, List, and DateTime called dart:io's exit(0), which is unavailable on web. Dump-and-exit now routes through the new NyLogger.dd() helper, which skips the exit() step on web and behaves like dump() there
    • flutter pub get now resolves across all supported Flutter releases - characters was constrained to ^1.4.1, but the Flutter SDK vendors characters at an exact version and the 3.38 stable line ships 1.4.0. Dependency resolution therefore failed on any Flutter release that bundles characters 1.4.0. The constraint is now ^1.4.0, which resolves whether the SDK bundles 1.4.0 or 1.4.1
    • Router page transitions compile on Flutter 3.44+ - Flutter 3.44 relocated CupertinoPageTransitionsBuilder from the material library to the cupertino library. The router transition files (ny_page_transition_settings.dart, page_transition.dart, transition_type.dart) now import package:flutter/cupertino.dart so the class resolves on current Flutter releases
    Open source →
    Release notes

    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 new app_links dependency. Captured URIs are routed through the registered NyRouter; a path that is not registered routes to fallbackRoute when 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. Return true to let Nylo route automatically, or false to handle the URI yourself
    • NyDeepLinkHandler - Exported from router/ny_router.dart; encapsulates cold-start and warm-start URI capture and dispatch, with injectable AppLinks and dispatcher seams for testing

    Changed

    • Relaxed collection from ^1.19.1 to ^1.18.0 - collection is also vendored by the Flutter SDK; the looser floor removes the same class of resolution conflict as the characters fix below
    • Corrected the environment Flutter constraint from >=3.24.0 to >=3.38.4 - the previous value could not be satisfied alongside the sdk: ^3.10.7 Dart constraint (Flutter 3.24 ships Dart 3.5), so it now states the true minimum

    Deprecated

    • Nylo.onDeepLink(callback) - Superseded by Nylo.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() accessed stdout.supportsAnsiEscapes, which throws Unsupported operation on web because dart:io is unavailable in the browser. stdout access is now guarded behind a kIsWeb check
    • .dd() no longer throws UnsupportedError on Flutter web - the dd() ("dump and die") extensions on String, int, double, bool, Map, List, and DateTime called dart:io's exit(0), which is unavailable on web. Dump-and-exit now routes through the new NyLogger.dd() helper, which skips the exit() step on web and behaves like dump() there
    • flutter pub get now resolves across all supported Flutter releases - characters was constrained to ^1.4.1, but the Flutter SDK vendors characters at an exact version and the 3.38 stable line ships 1.4.0. Dependency resolution therefore failed on any Flutter release that bundles characters 1.4.0. The constraint is now ^1.4.0, which resolves whether the SDK bundles 1.4.0 or 1.4.1
    • Router page transitions compile on Flutter 3.44+ - Flutter 3.44 relocated CupertinoPageTransitionsBuilder from the material library to the cupertino library. The router transition files (ny_page_transition_settings.dart, page_transition.dart, transition_type.dart) now import package:flutter/cupertino.dart so the class resolves on current Flutter releases
    Open source →
  11. 7.25.0 15 May 2026
    Release notes

    Added

    • Closure-based validator on InputField - New validate parameter accepts (FormValidator validate, dynamic data) { ... }, letting you build rules inline without constructing a FormValidator up front. Use validate.that(data, "Field").minLength(3) inside the closure. Mutually exclusive with the existing formValidator parameter (enforced via assertion)
    • FormValidator.that(data, [attribute]) - New chainable configuration method that sets the value and attribute in a single call and returns this, designed for use inside InputField.validate closures
    • FormValidatorCallback typedef - Public signature void Function(FormValidator validate, dynamic data) for the closure used by InputField.validate
    • paddingOnly, paddingSymmetric, and visibleWhen extensions on StatefulWidget - Previously only available on StatelessWidget; StyledText and other StatefulWidgets can now be wrapped via these fluent helpers (e.g. StyledText.template(...).paddingOnly(top: 20))

    Fixed

    • InputField.handleValidationError now fires when validation results change - The callback was declared but never invoked by the internal _validate flow. Results are now reported on each transition (first run and whenever the error message changes), deferred to the next frame so handlers can safely call setState
    Open source →
  12. 7.24.2 10 May 2026
    Release notes

    Fixed

    • MetroService.runProcess no longer breaks the parent CLI's stdin - the helper used to wire stdin.pipe(process.stdin) to the child, which left the parent's stdin in a consumed state once the child exited. Subsequent readLineSync-based prompts (e.g. in scaffold-ui's auth/iap dialogs) returned null and the unhandled !-on-null tore down the program. The child now inherits the parent's file descriptors directly via ProcessStartMode.inheritStdio, leaving the parent's stdin untouched
    • dart_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 to 0 and SetConsoleMode(handle, 0) killed line input, echo, and processed input. As a result, stdin.readLineSync on Windows could not detect Enter after a Console.readKey call. The mask is now correctly OR-combined
    Open source →
  13. 7.24.1 10 May 2026
    Release notes

    Fixed

    • CollectionView no longer crashes mid-refresh on long lists - _onRefresh previously assigned _data = [] synchronously before awaiting the new data, which could leave the live SliverList pointing at an empty list mid-frame and throw RangeError when cached children relayed out. _data is now mutated only inside setState after the new data resolves
    • CollectionView accepts List<dynamic> returned from JSON-decoded API responses - previously a List<dynamic> (the typical shape from jsonDecode) would trip an internal List<T> assertion. The widget now lazily casts via List.cast<T>(), so callers no longer have to call .cast<T>() themselves
    • CollectionView.stateActions(name).refreshData() no longer clears the list mid-fetch - _data was 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 paginatedData on pull-to-refresh now preserves the existing list instead of incorrectly calling loadNoData(). The refresh indicator settles and the previous data remains visible
    Open source →
  14. 7.24.0 07 May 2026
    Release notes

    Added

    • Str helper 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)
    • Number helper 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 currency
    • Arr helper 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)
    • Obj helper 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)
    Open source →
  15. 7.23.1 01 May 2026
    Release notes

    Changed

    • Bumped error_stack dependency from ^2.1.1 to ^2.1.2
    Open source →
  16. 7.23.0 30 Apr 2026
    Release notes

    Added

    • NyStateManaged widget - A new StatefulWidget that accepts a child (either a State instance or a function returning one) and an optional stateName, allowing pre-built states to be wired into the widget tree directly via createState. Exported from package:nylo_support/widgets/ny_widgets.dart
    Open source →
  17. 7.22.0 28 Apr 2026
    Release notes

    Added

    • Toast helper methods now accept duration and data parameters - showToastSorry, showToastWarning, showToastInfo, showToastDanger, showToastOops, and showToastSuccess now forward optional duration (custom display time) and data (custom payload) arguments to the underlying showToast call

    Changed

    • description parameter on toast helpers is now optional - showToastSorry, showToastWarning, showToastInfo, showToastDanger, showToastOops, and showToastSuccess no longer require description, aligning their signatures with the underlying showToast method. Existing call sites continue to work unchanged
    Open source →
  18. 7.21.0 28 Apr 2026
    Release notes

    Removed (BREAKING)

    • Metro CLI theme scaffolding commands removed - The make:theme and make:theme_colors Metro commands have been removed along with their underlying methods (MetroService.makeTheme, MetroService.makeThemeColors, MetroService.addToTheme). The themesFolder, themeColorsFolder, and themeDarkFlag constants have also been removed. Themes can still be created manually in lib/resources/themes/
    Open source →
  19. 7.20.2 26 Apr 2026
    Release notes

    Changed

    • Bumped error_stack dependency from ^2.0.1 to ^2.1.1
    Open source →
  20. 7.20.1 26 Apr 2026
    Release notes

    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 pattern await 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_plus dependency from ^1.2.8 to ^1.2.9
    Open source →
  21. 7.20.0 20 Apr 2026
    Release notes

    Added

    • New useSafeArea option on NavigationHubLayout.journey() - Controls whether journey content is wrapped in a SafeArea. Defaults to true (existing behavior). Set to false for edge-to-edge journey pages where backgrounds should extend under system UI (status bar, home indicator)
    Open source →
  22. 7.19.0 12 Apr 2026
    Release notes

    Changed (BREAKING)

    • Connective widget redesigned - Flipped semantics from "show when connected" to "show when missing". Removed onWifi, onMobile, onEthernet, onVpn, onBluetooth, onSatellite, onOther, onNone parameters in favour of a single noInternet parameter that displays a fallback when the device has no internet (wifi, mobile, or ethernet). Migration: replace onNone: widget with noInternet: widget. Use Connective.builder() for any custom connectivity handling
    • Removed showLoadingOnInit and loadingWidget from Connective - the initial connectivity check is near-instant, making a loading state unnecessary
    • OfflineBanner now checks for internet absence (wifi/mobile/ethernet) rather than NyConnectivityState.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 than isOnline() which passes for any non-none result

    Fixed

    • CollectionView.refreshData state action - Re-fetches data explicitly for both pullable and regular modes instead of relying on reboot(), resetting pagination, loading state, and footer state correctly
    Open source →
  23. 7.18.1 11 Apr 2026
    Release notes

    Fixed

    • CollectionView not updating when parent rebuilds with new data - Sync data callbacks (e.g. data: () => _filteredList) were only read once due to _syncDataInitialized flag introduced in v7.16.0, breaking filtering/search patterns. Added didUpdateWidget override to reset the flag on parent rebuilds while preserving stateActions behavior

    Added

    • CollectionView test coverage - Added 29 tests covering CollectionItem helpers, sync/async data, empty states, headers, spacing, transform/sort, separated/grid layouts, parent-driven data updates, and configuration options
    Open source →
  24. 7.18.0 11 Apr 2026
    Release notes

    Added

    • New actingAsGuest() test helper - Semantic alias for logout() 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
    Open source →
  25. 7.17.0 11 Apr 2026
    Release notes

    Added

    • New visit() test helper - Pump a route with full Nylo navigation support, setting up MaterialApp with the NyRouter's route generator, navigator key, and route history observer so that routeTo navigation works correctly in tests
    • New assertNavigatedTo() test helper - Assert that the app navigated to a given route by checking Nylo.getCurrentRouteName() matches the expected route path
    • New settle() test helper - A readable alias for pumpAndSettle that waits for all animations, frame callbacks, and pending UI updates to complete
    Open source →
  26. 7.16.0 11 Apr 2026
    Release notes

    Fixed

    • CollectionView stateActions not working with synchronous data - State actions like addItem, insertItem, removeFromIndex, and updateItemAtIndex were being overwritten on every rebuild because _buildRegularView re-called the data callback. Now synchronous data is only fetched once and preserved across rebuilds
    • NyPage controller state name assignment - Controller now receives the correct state name

    Added

    • New InputField state actions - focus(), unfocus(), and toggleObscure() for programmatic control of text fields
    • New LanguageSwitcher.stateActions() - refresh() and setLanguage() methods for programmatic language switching

    Changed

    • Bumped app_badge_plus to ^1.2.8
    • Bumped connectivity_plus to ^7.1.1
    Open source →
  27. 7.15.0 06 Apr 2026
    Release notes

    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 up APP_DOMAIN. Supports chained references, non-string value conversion, and circular reference protection
    Open source →
  28. 7.14.1 03 Apr 2026
    Release notes

    Fixed

    • bottomToTop and topToBottom page transitions animating the previous route - Added canTransitionFrom override to PageTransition that returns false for bottomToTop and topToBottom transition types, preventing the outgoing page from sliding away during modal-style transitions
    Open source →
  29. 7.14.0 02 Apr 2026
    Release notes

    Added

    • isDismissible and enableDrag parameters for NyBaseModal.show() - New optional parameters to control whether the modal can be dismissed by tapping the barrier (isDismissible, defaults to true) and whether the modal supports drag-to-dismiss gestures (enableDrag, defaults to true). Both are passed through to the underlying showModalBottomSheet
    Open source →
  30. 7.13.0 31 Mar 2026
    Release notes

    Added

    • Satellite connectivity support for Connective widget and NyConnectivityState - Added satellite value to the NyConnectivityState enum with mapping from ConnectivityResult.satellite, and added onSatellite widget parameter to Connective for rendering satellite-specific UI
    • Wildcard * key for StyledText.template styles 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
    Open source →
  31. 7.12.0 29 Mar 2026
    Release notes

    Added

    • creationPath support for Metro scaffolding commands - Provider, route guard, form, and event scaffolding commands now support creationPath using createPathForDartFile and createDirectoriesFromCreationPath for consistent nested directory path handling
    • setState callback parameter for NyFieldBuilder - The NyFieldBuilder typedef now includes a setState callback parameter. A NyFieldBuilderLegacy typedef is available for backward compatibility. Field.builder accepts both signatures

    Changed

    • Updated dependency constraints: flutter_timezone ^5.0.2, patrol ^4.5.0
    Open source →
  32. 7.11.2 12 Mar 2026
    Release notes

    Fixed

    • Response data unavailable in handleSuccess/handleFailure callbacks - When skipMorph was true (a callback was provided), morphedData was left null, so nyResponse.data was inaccessible inside the callback. The raw response data is now passed through to morphedData when the type matches, allowing callbacks to access nyResponse.data
    Open source →
  33. 7.11.1 12 Mar 2026
    Release notes

    Fixed

    • toast-oops calling wrong toast method - The toast-oops state action was incorrectly calling showToastInfo() instead of showToastOops(), causing oops-style toasts to display as info-style toasts
    • Field.password() not respecting viewable parameter - The viewable parameter was not being passed through to FieldStyleTextField.password(), so the password visibility toggle setting was ignored when constructing password fields

    Changed

    • NyPage.initState() state name resolution - The state name for NyStatefulWidget is now resolved unconditionally in initState(), rather than only when stateManaged is true. The event bus subscription logic is now a single stateManaged && allowStateUpdates check with reduced nesting
    • Updated dependency constraints: flutter_local_notifications ^21.0.0, timezone ^0.11.0, patrol ^4.3.0
    Open source →
  34. 7.11.0 11 Mar 2026
    Release notes

    Added

    • action() method on StateActions - New convenience method to call stateAction() directly from any StateActions instance, accepting an action name and optional data parameter

    Fixed

    • Controller not initialized before init() in NyPage and NyState - The controller is now eagerly constructed with the current context if 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
    Open source →
  35. 7.10.0 09 Mar 2026
    Release notes

    Added

    • enableInteractiveSelection for InputField and FieldStyleTextField - New parameter to control whether text selection handles and toolbar are shown. Available on InputField, InputField.compact, InputField.password, InputField.email, InputField.fromFieldStyleText, and FieldStyleTextField

    Fixed

    • FieldStyleTextField.copyWith losing existing values - Parameters like textCapitalization, maxLengthEnforcement, onAppPrivateCommand, inputFormatters, cursorWidth, dragStartBehavior, and clipBehavior now correctly fall back to this.xxx instead of overriding with hardcoded defaults
    Open source →
  36. 7.9.1 06 Mar 2026
    Release notes

    Fixed

    • Form submit button not calling onSubmit - Fixed ButtonState passing NyFormData.stateName (already prefixed with form_) to NyFormWidget.submit(), which added the prefix again resulting in form_form_FormName. Now correctly passes NyFormData.name so the state name resolves properly
    Open source →
  37. 7.9.0 05 Mar 2026
    Release notes

    Added

    • Data-aware toast notification styles - Toast styles can now receive dynamic data at call time via a new ToastStyleDataFactory typedef. Register data-aware styles with registerWithData() or pass both static and data-aware factories to registerAll() and addToastNotifications()
    • data parameter for toast helpers - Added optional data parameter to showToastNotification(), NyBaseState.showToast(), NyBaseState.showToastCustom(), NyController.showToastCustom(), and StateAction.showToastCustom() to pass custom key-value pairs to data-aware toast styles
    • ToastNotificationRegistry.resolve() - New method that resolves a toast style by ID and passes data to data-aware factories, replacing direct get() calls internally
    • enablePullDown parameter for CollectionView - Added enablePullDown option to all CollectionView constructors (.list, .separated, .grid, .pullable, .pullableSeparated, .pullableGrid) to control whether pull-to-refresh is enabled

    Changed

    • Renamed API pagination parameters - queryParamPage renamed to paramPage and queryParamPerPage/queryNamePerPage renamed to paramPerPage in nyApi() and api() helpers for consistency
    • NyFormWidget state methods use stateAction() - Refactored stateSetValue(), stateSetOptions(), clearField(), and submit() to use stateAction() instead of updateState() for cleaner form state management
    Open source →
  38. 7.8.1 04 Mar 2026
    Release notes

    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
    Open source →
  39. 7.8.0 03 Mar 2026
    Release notes

    Added

    • NavigationHubStateActions.refreshTab() - Refresh a specific tab by index, forcing it to rebuild with a new UniqueKey
    • NavigationHubStateActions.refresh() - Refresh all tabs in the navigation hub, forcing them all to rebuild
    • rootNavigator parameter for pop() - Added rootNavigator option to NyBaseState.pop(), NyController.pop(), StateAction.pop(), and BuildContext.pop() to support popping from the root navigator when using nested navigation
    Open source →
  40. 7.7.1 02 Mar 2026
    Release notes

    Fixed

    • ArgumentsWrapper JSON serialization crash - Route arguments containing non-serializable objects (e.g. model instances, enums) would throw a JsonUnsupportedObjectError when Flutter's NavigatorState called jsonEncode during state restoration or post-navigation logging. A new _safeEncode() helper now recursively converts non-primitive values to safe representations before encoding
    • Missing toJson() on ArgumentsWrapper - Added toJson() method required by Flutter's NavigatorState for JSON encoding route arguments
    Open source →
  41. 7.7.0 01 Mar 2026
    Release notes

    Added

    • Field.builder constructor - New constructor that lets developers create custom form fields inline using a builder function, without needing to subclass NyFieldStatefulWidget. Includes NyFormBuilder widget and FormBuilderStateActions with clear and setValue support
    • FormValidator.nullable() method - Mark a validator as nullable so that null or empty values automatically pass validation; non-empty values still have all rules applied
    • LanguageSwitcherAnimationStyle - New configuration class for controlling animations on the LanguageSwitcher inline popup trigger and bottom modal list items, with preset factories: none(), subtle(), bouncy(), and fadeIn()
    • useRootNavigator parameter for LanguageSwitcher.showBottomModal - Allows the bottom modal to be presented above all navigators when using nested navigation

    Fixed

    • InputField autocorrect property not forwarded - The autocorrect parameter was accepted by the widget but never passed to the underlying TextField

    Changed

    • Simplified NyFormPicker selected value layout from a Stack with Positioned widgets to a Column, improving readability and consistency
    • LanguageSwitcher inline popup now supports trigger scale animation, popup content fade-in via _PopupContentFade, and configurable animation durations and curves for list item transitions
    Open source →
  42. 7.6.0 26 Feb 2026
    Release notes

    Added

    • Backpack.read<T>() Map deserialization - When a value stored in the Backpack is a raw Map<String, dynamic> (e.g. from syncKeys), calling read<T>() with a typed parameter now automatically deserializes it into the corresponding model and caches the result for subsequent reads
    • Loading indicator for LanguageSwitcher list items - Tapping a language in LanguageSwitcher.showBottomModal now displays a CircularProgressIndicator on the selected item while the language switch processes, providing clear visual feedback

    Fixed

    • CollectionView findChildIndexCallback renamed to findItemIndexCallback - Updated the ListView.separated builder to use the renamed Flutter SDK parameter, fixing compatibility with recent Flutter versions
    • LanguageSwitcher modal not closing immediately on selection - Moved navigator.pop() to execute before storeLanguage and onLanguageChange so 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 direct T != dynamic / T == Type comparisons in Backpack and NyStorage for cleaner, more idiomatic type checking
    • Changed _LanguageListItem.onTap type from VoidCallback to Future<void> Function() to support async tap handling with loading state
    Open source →
  43. 7.5.0 21 Feb 2026
    Release notes

    Added

    • contentPadding and actionsPadding for NyBaseModal.show() and NyModalLayout - 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 on passwordViewable, returning null when disabled instead of always rendering a non-functional IconButton
    • InputField suffixIcon overriding password toggle - Custom suffixIcon is now only applied when passwordViewable is 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). The title parameter now passes through as-is, allowing the toast notification registry to handle default titles consistently with the i18n approach
    Open source →
  44. 7.4.0 14 Feb 2026
    Release notes

    Added

    • onLanguageChange callback for LanguageSwitcher.showBottomModal - New optional callback parameter that fires when the user selects a different language, providing the selected language key

    Fixed

    • LanguageSwitcher.showBottomModal future completing immediately - Added missing return before showModalBottomSheet so the method's future now correctly waits for the modal to close before completing
    Open source →
  45. 7.3.1 14 Feb 2026
    Release notes

    Fixed

    • App lifecycle not assigned in Nylo.init() - The appLifecycle parameter was accepted but never assigned to _appLifecycle, causing nylo.appLifecycleStates to always return null. Now correctly assigns the value during initialization

    Changed

    • Removed unused _formCasts field and related methods (addFormCasts, getFormCasts) from the Nylo class
    • Removed unused formCasts parameter from Nylo.configure()
    • Updated flutter_local_notifications constraint to ^20.1.0
    • Updated timezone constraint to ^0.10.0
    Open source →
  46. 7.3.0 14 Feb 2026
    Release notes

    Added

    • Localization fallback locale support - When a translation key is missing in the current locale, NyLocalization now 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 in Nylo.init() to ensure all locale-specific date format data is available, preventing failures when formatting dates in non-default locales
    • Modal keyboard overlap - NyBaseModal now applies bottom padding matching MediaQuery.viewInsets.bottom when isScrollControlled is true, preventing the on-screen keyboard from covering modal content
    Open source →
  47. 7.2.0 12 Feb 2026
    Release notes

    Added

    • FieldDefinition class and define() helper - Set both a value and options for form fields in NyFormWidget.init, enabling deferred option loading from APIs
    • PickerListTileStyle - Style configuration for picker bottom sheet list tiles with radio, checkmark, and custom builder presets via PickerListTileIndicator
    • FieldStylePicker alignment properties - Added placeholderAlignment, selectedValueAlignment, and selectedValuePadding for fine-grained picker layout control
    • FieldStyleDateTimePicker clear controls - Added canClear and clearIconData properties to control date/time field clearing behavior
    • FieldStyleSwitchBox extended properties - Added activeTrackColor, inactiveThumbColor, inactiveTrackColor, thumbColor, trackColor, trackOutlineColor, thumbIcon, dragStartBehavior, and thumb image properties
    • InputField suffixIcon support - Added suffixIcon parameter across all InputField constructors and copyWith
    • StyledText.template key:text syntax - New {{key:text}} placeholder syntax for localization-friendly styled text where the display text is separate from the style lookup key
    • FormCollection.empty() constructor - New const constructor for empty form collections, useful as a default for fields with deferred options
    • Field.datetime / Field.date direct parameters - Added firstDate, lastDate, dateFormat, and initialPickerDateTime directly on field constructors
    • Field.picker / Field.radio / Field.chips optional options - The options parameter is no longer required; defaults to FormCollection.empty() for deferred loading via define()
    • New styled_text_test.dart test suite for StyledText.template with key:text and pipe-key syntax

    Fixed

    • NavigationHub unselected label styling - Now applies unselectedLabelStyle and unselectedItemColor to inactive tabs
    • NavigationHub activeIcon fallback - Falls back to page.value.icon before text widget when no activeIcon is set
    • Form field state actions (picker, chips, radio) - Changed setValue to restoreValue in clear/setValue actions to prevent redundant UI update cycles
    • NyResponse.ifSuccessful / when null safety - Fixed type promotion with local variable for proper null-safety
    • Field.currency initial value - Now uses dummyData as fallback for initial value when value is null
    • InputField format-on-init - Initial text values now pass through input formatters so programmatic values (e.g. from define()) display formatted
    • InputField setValue with formatters - The setValue state action now applies input formatters to the value

    Changed

    • Added WidgetsFlutterBinding.ensureInitialized() to Nylo.configure() to ensure binding before configuration
    • Added explicit return types and dynamic parameter types across multiple methods for lint compliance
    • Removed global analyzer ignores for non_constant_identifier_names and camel_case_types from analysis_options.yaml; moved to targeted ignore_for_file comments
    • Validation errorResponses now uses whereType<FormValidationError>() instead of where().cast()
    • Updated test suite for Flutter Color API changes (.r/.g/.b/.a/.toARGB32())
    • Documentation comment fixes for escaped generic types in dartdoc
    Open source →
  48. 7.1.0 10 Feb 2026
    Release notes

    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_back
      • nylo.collection_view.no_results, nylo.collection_view.pull_up, nylo.collection_view.failed, nylo.collection_view.release
      • nylo.offline_banner.message
      • nylo.form_picker.select, nylo.form_picker.clear
      • nylo.language_switcher.title
      • nylo.journey.of, nylo.journey.step, nylo.journey.back, nylo.journey.next, nylo.journey.finish
      • nylo.confirm_action.cancel, nylo.confirm_action.confirm
    • NyBaseModal enhancements - Added useRootNavigator and modalBackgroundColor parameters to NyBaseModal.show() and NyModalLayout
    • InputField multiline improvements - Auto-sets alignLabelWithHint and textAlignVertical for multiline fields; passes through prefixIconConstraints from decoration
    • Exported CustomAnimationBuilder from flutter_styled_toast via ny_core.dart

    Changed

    • Event system parameter renamed from params to data across NyListener, NyEventBus, NyEventCallbackListener, and NyEventExtension for clarity
    • DioApiService.handleResponse now conditionally skips data morphing when handleSuccess or handleFailure callbacks are provided, and properly returns callback results
    • DioApiService caching logic fixed to avoid null reference when saving cached responses
    • NyBaseModal.show() default for useSafeArea changed from true to false
    • JourneyContent uses Expanded instead of Flexible for main content area
    • Replaced ny_metro.dart imports with collection package in InputField and LanguageSwitcher
    • Added collection package dependency (^1.19.1)
    Open source →
  49. 7.0.0 06 Feb 2026
    Release notes

    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 to lib/alerts/src/ with barrel ny_alerts.dart
      • lib/controllers/ files moved to lib/controllers/src/ with barrel ny_controllers.dart
      • lib/event_bus/ files moved to lib/event_bus/src/ with barrel ny_event_bus.dart
      • lib/events/ files moved to lib/events/src/ with barrel ny_events.dart
      • lib/helpers/ files moved to lib/helpers/src/ with barrel ny_helpers.dart
      • lib/local_notifications/ files moved to lib/local_notifications/src/ with barrel ny_local_notifications.dart
      • lib/local_storage/ files moved to lib/local_storage/src/ with barrel ny_local_storage.dart
      • lib/localization/ files moved to lib/localization/src/ with barrel ny_localization.dart
      • lib/metro/ files moved to lib/metro/src/ with barrel ny_metro.dart
      • lib/networking/ files moved to lib/networking/src/ with barrel ny_networking.dart
      • lib/providers/ files moved to lib/providers/src/ with barrel ny_providers.dart
      • lib/router/ files moved to lib/router/src/ with barrel ny_router.dart
      • lib/themes/ files moved to lib/themes/src/ with barrel ny_themes.dart
      • lib/widgets/ files moved to lib/widgets/src/ with barrel ny_widgets.dart
      • lib/dart_console/ reorganized with barrel ny_dart_console.dart
    • New unified entry point - lib/ny_core.dart exports all modules in one import
    • Nylo.init() signature changed - Now requires env parameter as EnvGetter type and accepts BootConfig for setup. The setup and setupFinished callbacks have been replaced by the BootConfig class pattern
    • NyEnvRegistry introduced - Environment variables are now managed through NyEnvRegistry.register(getter: Env.get) instead of reading .env files directly
    • Theme system rewritten - Replaced theme_provider package with new NyThemeManager singleton, NyThemeProvider widget, and NyThemeStorage for persistence. Theme registration now uses nylo.addThemes() with optional initialThemeId parameter
    • Removed BaseColorStyles - Replaced by ThemeColor abstract class in lib/themes/src/theme_color.dart
    • Widget renames:
      • NyRichText renamed to StyledText (with StyledText.template() constructor)
      • NyTextField renamed to InputField
      • NyFutureBuilder renamed to FutureWidget
      • NyFader renamed to FadeOverlay (with .top(), .bottom(), .left(), .right() constructors)
      • NyPullToRefresh and NyListView consolidated into CollectionView (with CollectionItem wrapper class)
      • NyPullable renamed to Pullable
      • NyLanguageSwitcher renamed to LanguageSwitcher
    • Removed NyTextStyle - No longer part of the library
    • Removed ValidationException - Validation exceptions moved to form-specific handling
    • Removed NyLoginForm - Replaced by general NyForm capabilities
    • Removed events.dart - Events now use dedicated ny_events.dart barrel with new architecture
    • Removed router.dart - Router now uses dedicated ny_router.dart barrel
    • Removed dart_console.dart - Dart console now uses dedicated ny_dart_console.dart barrel
    • 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 with init(), actingAs(), travel(), travelForward(), travelBack(), freezeTime(), dump(), dd() methods
      • NyWidgetTest - Widget testing utilities with pumpNyWidget() and pumpNyWidgetSimple() for easy widget testing
      • NyTime - Time manipulation for testing (freeze, advance, rewind)
      • NyFactory / NyFaker - Laravel-style model factories for generating test data
      • NyMockApi - API mocking with type-based handlers and URL pattern matching (supports * and ** wildcards)
      • NyMockChannels - Platform channel mocking for tests
      • NyMockRouteGuard - Route guard mocking
      • NyTestCache - In-memory cache for tests
      • NyStateTestHelpers - 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 with isOnline(), 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. Includes Connective.builder(), OfflineBanner widget, and widget extensions .connectiveOr(), .onlyOnline(), .onlyOffline()
    • NyEnvRegistry (lib/helpers/src/ny_env.dart) - New centralized environment variable management with register(), get(), containsKey(), isInitialized
    • BootConfig (lib/providers/src/providers.dart) - New configuration class for bootstrapping Nylo applications with setup and boot lifecycle 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 with isSuccessful, 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 with onApiSuccess() and onApiError() callbacks
    • NyThemeManager (lib/themes/src/ny_theme_manager.dart) - Singleton theme manager with reactive updates via themeNotifier, 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 with AnimatedTheme for 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 with UrlLaunchModeType enum (externalApplication, inAppWebView, inAppBrowserView, platformDefault)
    • FadeOverlay widget - Replaces NyFader with directional constructors: FadeOverlay.top(), .bottom(), .left(), .right() and configurable strength parameter
    • CollectionItem wrapper class - Provides isFirst, isLast, isEven, isOdd, index, totalItems helpers 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 FormSlider and FormRangeSlider form fields, new FormTextField field, new FieldStyle configuration 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 Runnable services
    • Nylo.wipeStorage() - Renamed from wipeAllStorageData() with added excludeKeys parameter
    • 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 accepting List<FutureOr<Runnable>> with three lifecycle phases: onInit(), onReady(), onAppReady()
    • useDevPanelLogging() - Integration hooks for external dev panel logging with onLog and onRouteChange callbacks
    • 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, and services parameters
    • Toast notifications now use a registry pattern with ToastNotificationRegistry and ToastStyleFactory - configure via nylo.addToastNotifications()
    • Local storage split into focused modules: StorageConfig, StorageManager, StorageUtils, StorageHelpers, and NyStorage
    • Local notifications restructured with dedicated configuration classes: AndroidNotificationConfig, IOSNotificationConfig, LocalNotification, NotificationAttachment, NotificationException
    • Events system refactored into: NyEvent interface, EventBus, EventSubscription, event extensions, and Listener
    • NyLogger now supports onLog callback for external logging integration
    • NyRouteHistoryObserver now supports onRouteChange callback for external route tracking
    • Theme persistence migrated from SharedPreferences to FlutterSecureStorage
    • NyLocalization refactored with NyLocalizationConfig class for configuration
    • Updated service_runner dependency
    • Updated flutter_local_notifications to ^20.0.0
    • Updated connectivity_plus to ^7.0.0
    • Updated various other dependencies to latest versions
    • pubspec.yaml repository URL updated to 7.x branch
    • pubspec.yaml SDK constraint updated to ^3.10.7
    • Added patrol as dev dependency for widget testing
    • Updated logo/screenshot

    Removed

    • Removed theme_provider package dependency - replaced by built-in NyThemeManager/NyThemeProvider
    • Removed pretty_dio_logger package dependency - replaced by built-in NetworkLogger interceptor
    • 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)
    Open source →
  50. 6.38.1 13 Dec 2025

    Nothing published for this version

  51. 6.38.0 14 Nov 2025

    Nothing published for this version

  52. 6.37.0 28 Oct 2025

    Nothing published for this version

  53. 6.36.0 12 Oct 2025

    Nothing published for this version

  54. 6.35.2 22 Sep 2025

    Nothing published for this version

  55. 6.35.1 06 Sep 2025

    Nothing published for this version

  56. 6.35.0 18 Jul 2025
    Release notes
    • Fix stateData in NyState to return the correct data type
    Open source →
  57. 6.34.0 17 Jul 2025
    Release notes
    • Added lifecycleActions to Nylo.init. This will allow you to global handle your app's lifecycle.
    • Add missing annotations
    • Update pubspec.yaml
    Open source →
  58. 6.33.0 14 Jul 2025
    Release notes
    • Added lifecycleActions to NyPage. This will allow you to handle lifecycle events in your pages.
    • Update pubspec.yaml
    Open source →
  59. 6.32.0 02 Jul 2025
    Release notes
    • Added excludeKeys to NyStorage.deleteAll. This will allow you to exclude certain keys from being deleted when calling deleteAll.
    • Added hasExecutedTaskOnce in NyScheduler. This will allow you to check if a task has been executed.
    • Update pubspec.yaml
    Open source →
  60. 6.31.0 24 Jun 2025
    Release notes
    • Added set to NySession class. This will allow you to set a value in the session.
    • Added onFailure parameter to isSuccessful method in NyValidator.
    • Fix getInitialRouteName to return the correct initial route name when, when is used.
    Open source →

Every package, every release, already written down.

The archive is open and free. Watching your own project is what we are building next.

Browse the archive