- Bumped
error_stack dependency from ^2.1.1 to ^2.1.2
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
- 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
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
- 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/
- Bumped
error_stack dependency from ^2.0.1 to ^2.1.1
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
NyScheduler.clearTaskOnce(name) convenience method that clears a once-task's executed state without needing to compute the storage key manually
- Bumped
app_badge_plus dependency from ^1.2.8 to ^1.2.9
- 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)
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
- New
NyConnectivity.hasInternet() helper - Checks specifically for wifi, mobile, or ethernet connectivity. Stricter than isOnline() which passes for any non-none result
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
- 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
- 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
- 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
- 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
- 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
- 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
- Bumped
app_badge_plus to ^1.2.8
- Bumped
connectivity_plus to ^7.1.1
- 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
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
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
- 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
- Updated dependency constraint:
connectivity_plus ^7.1.0
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
- Updated dependency constraints:
flutter_timezone ^5.0.2, patrol ^4.5.0
- 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
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
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
action() method on StateActions - New convenience method to call stateAction() directly from any StateActions instance, accepting an action name and optional data parameter
- 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
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
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
- 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
- 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
- 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
- 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
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
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
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
InputField autocorrect property not forwarded - The autocorrect parameter was accepted by the widget but never passed to the underlying TextField
- 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
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
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
- 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
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
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
- 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
onLanguageChange callback for LanguageSwitcher.showBottomModal - New optional callback parameter that fires when the user selects a different language, providing the selected language key
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
- 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
- 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
- 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
- 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
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
- 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
- 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
- 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
- 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)
- 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
- 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/)
- 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
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)
- Fix stateData in
NyState to return the correct data type
- Added
lifecycleActions to Nylo.init. This will allow you to global handle your app's lifecycle.
- Add missing annotations
- Update pubspec.yaml
- Added
lifecycleActions to NyPage. This will allow you to handle lifecycle events in your pages.
- Update pubspec.yaml
- 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
- 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.
- Added
PullableConfig to pullable widget.
- Update pubspec.yaml
- Added new
visibleWhen extension to Widget class. This will allow you to show or hide a widget based on a condition.
- Added
onPop to the pushTo method. This will allow you to receive a callback when the page is popped.
- Added
removeFromIndex to NyPullToRefresh. This will allow you to remove an item from the list at a specific index.
- Bug fix for
NyTextField onChanged method.
- Fix analysis_options.yaml
- Update pubspec.yaml
- Fix:
getEnv helper to return an empty string if a variable is set like this APP_WEBSITE=""
- Add Dart Console to project
- Update pubspec.yaml
- Fix:
Field.date not using the correct display format
- Add: export 'form_chips and form_radio' to ny_widgets.dart
- Add:
prefixIcon to Field.password
- Fix:
_whenStateAction method in NyState
- Added:
nylo.broadcastEvents()to broadcast events to all listeners.
- Added:
listenOn to listen to events in your app. E.g. listenOn<MyEvent>((event) { });
- Added:
listen helper in NyPage and NyState to listen to events in your app. E.g. listen<MyEvent>((event) { });
- Updated:
event helper to support new broadcast parameter. E.g. event<MyEvent>(data: {...}, broadcast: true);
- Small breaking change to
stateActions:
- Was:
Map<String, Function()> get stateActions
- Now:
Map<String, Function> get stateActions
- Added:
JourneyProgressStyle? progressStyle; to journey widget
- Added:
JourneyButtonStyle? buttonStyle; to journey widget
- Added:
backgroundGradient to bottomNav, topNav and journey widget
- Updated:
stateAction to support new data parameter
- New progress styles added to
JourneyProgressStyle - linear, dots, numbered, segments, circular, timeline, custom
- New
JourneyButtonStyle added to JourneyState - default, primary, secondary, tertiary
- New
JourneyButtonStyle added to JourneyState - standard, minimal, outlined, contained, custom
- Added:
JourneyState class to help manage NavigationHubLayout.journey
- Added:
JourneyHelper class to help manage JourneyState's
- Added:
makeJourneyWidget method to MetroService class
- Added:
parentOption to constants
- Added:
syncToStorage method to NySession class. This will sync the session data to storage
- Added:
syncFromStorage method to NySession class. This will sync the session data from storage
- Fix
NyStorage.read method
- Added:
makeCommand to MetroService class. This will allow you to create a custom command in your project.
- Added:
addPackages method to MetroService
- Added:
dev parameter to addPackages and addPackage methods
- Added:
withQueryParams to RouteView class
- Added:
hasQueryParameter(String key) to NyState class. This will allow you to check if a query parameter exists in the current route.
- Update:
runProcess to connect all streams to the process
- Added:
toTimestamp() helper for DateTime to convert to a timestamp
- Tidy:
NyTextField class
- Fix:
NyPage stateName if not given correct closure name
- Fix:
Auth.authenticate method not setting the correct object data for the Backpack class
- Update:
session helper to support 'items'. E.g. session('onboarding', {"first_name": "john"}), now session will contain {"first_name": "john"}
- Update:
session helper 'data' method to support data([String? key]) to get the session data. E.g. session('onboarding').data('first_name')
- Fix: Cannot add new events after calling close in NyForm 231
- Update pubspec.yaml
- Small fix for
BadgeTab
- Refactor imports to not include
package:nylo_support
- New PageTransitionTypes: scale, rotate, size, rightToLeftWithFade, leftToRightWithFade, leftToRightJoined, rightToLeftJoined, topToBottomJoined, bottomToTopJoined, leftToRightPop, rightToLeftPop, topToBottomPop, bottomToTopPop, sharedAxisHorizontal, sharedAxisVertical, sharedAxisScale
- New
TransitionType added for route transitions. E.g. routeTo(HomePage.path, transitionType: TransitionType.fade())
- Ability to
setBadgeNumber of app icon
- Update pubspec.yaml
- Add
ny_future_builder.dart to ny_widgets library
- Added
label to Forms. E.g. Field.email('Email', label: 'Email Address')
- Added
Radio to Forms. E.g. Field.radio("Favourite Color", options: ["Red", "Blue", "Green"])
- Added
Widget to Forms. E.g. Field.widget(child: MyWidget())
- Add
submitButton to NyFormData Read more here
- Add ny_networking.dart, ny_router.dart, ny_alerts.dart, ny_helpers.dart to make it easier to import the different parts of the library
- Update sleep method to support micro seconds. E.g.
sleep(0, 500) will sleep for 500 microseconds
- Small bug fix for
NavigationTab.alerts
- Merge PR from israelins85
- Update pubspec.yaml
- Fix issue when resetting the
NyPullToRefresh widget
- Added new
stateAction() helper to allow you to send state actions to the NyState or NyPage class
- New
whenStateAction(Map<String, Function()> actions) method added to NyState and NyPage classes to handle state actions
- E.g.
whenStateAction({"showDialog": () => showDialog()})
- New
Map<String, Function()> get stateActions => {} getter added to NyState and NyPage classes to handle state actions
- E.g.
Map<String, Function()> get stateActions => {"showDialog": () => showDialog()};
- Update pubspec.yaml
- Fix issue with Forms setting dummyData even if app env is not dev
- Update pubspec.yaml
- Forms - Ability to set fields as
readOnly
- Fix issue "stream has already been listened to" #215
- Fixes for NavigationHub
- Small refactor to
Pullable widget
- Update pubspec.yaml
- Add new
NavigationTab.alert widget for supporting alerts in the NavigationTab
- New extension
toBool and tryParseBool added to String class
- New StateActions added to
NavigationHubStateActions
alertEnableTab - Enable the alert for a specific tab
alertDisableTab - Disable the alert for a specific tab
- Update pubspec.yaml
- Fix small issue with
NavigationHub not using the correct icon when active
- Update pubspec.yaml
- Added comprehensive DateTime manipulation methods:
- Year operations:
addYears() and subtractYears()
- Month operations:
addMonths() and subtractMonths()
- Day operations:
addDays() and subtractDays()
- Hour operations:
addHours() and subtractHours()
- Minute operations:
addMinutes() and subtractMinutes()
- Second operations:
addSeconds() and subtractSeconds()
- Update NavigationHub to support the following:
- Set a default current tab index: Override
currentIndex in your NavigationHub class
- New
bottomNavBuilder method to build the bottom navigation bar
- DateTime extension:
- Allow
toDateString to accept a String format
- Add
toDateStringUK to format the date in UK format
- Add
toDateStringUS to format the date in US format
- New
localAsset method added to AssetImage
- Update pubspec.yaml
- Small change to
getPublicAsset to remove first slash if it exists
- Add
Field.capitalizeSentences and Field.capitalizeWords
- Make
updatePageState public
- Ensure
handleSuccess handles responses within the correct status code range. Fixes 207
- Fix
header parameter in NyPullToRefresh and NyListView
- Small fix for NyForm
- Improvements to NavigationHub to support Text tabs and Icons
- Updates to
NavigationTab to support updating the Page, Title, Icon, Background Color and Tooltip
- Update pubspec.yaml
- Fix updateState method when using NyPage.path
- Small fix for route guards when using redirect
- Make
updatePageState private
- Update pubspec.yaml
- Small fix for
NyLanguageSwitcher to support dark mode
- Update copyright year
- New
currentTabIndex method added to NavigationHubStateActions to set the current tab index
- Fix validation max and min rules
- New
init method added to Forms
- Small refactor to
NyForm class
- Update loadingStyle
render method
- Fix stateName in NyState
- Slight refactor to
NyBaseState
- Fix
useLocalNotifications in Nylo class
- Add
kIsWeb check to clearBadgeNumber
- Update
date_field to ^6.0.0
- Add
headerSpacing and footerSpacing to NyForm
- Fix stops in
NyFader
- Merge PR from ruwiss
- New
NyTextStyle class
- New
NyColor class
- Update form picker, form chips and checkbox to support light and dark colors better
- New
NyColor.resolveColor method
- Remove
Nylo.package method
- New
getAuthKey() method
- Update
delete request to support optional parameters
- Add
LoadingStyle to helpers/loading_style.dart
- New
loadingStyle: loadingStyle parameter added to ButtonState class
- Fix nylo-core/nylo#187
- Fix
saveRemember and saveForever in NyCache
- Update pubspec.yaml
- New
Field.switchBox added to NyForm to create a switch box field
- Localization support for picker and datetime fields
currency.toLowerCase() in Field.currency()
- Update pubspec.yaml
- Add
NyLocaleHelper
- New
Nylo.package helper for initializing packages
- Fix
NyStoreage.read helper
- New
nyPageName extension helper added to RouteView
- Update
StateAction to support RouteView paths
- Dark mode support for Form fields: picker, date picker, checkbox and chips
- New helper
color({light, dark}) to get the color based on the theme
- New helper
whenTheme({light, dark}) to handle widgets based on the theme
- Add
NyThemeType to BaseThemeConfig. This will allow you to set if a theme is light or dark
- Contribution from stensonb to update the documentation for the sleep method
- Update pubspec.yaml
- New
initDio(Dio dio) method added to DioApiService
- Update
updateState to support RouteView paths
- Allow
NyPage to support stateManaged methods using bool get stateManaged => true;
- Update pubspec.yaml
- Override
build in NyPage to support loading using a Scaffold
- Rename
Session to NySession
- Fix typo with skeletonizer
- Update pubspec.yaml
- Update local push notifications
- Add local push notifications
- New version of Nylo - read more about the changes here
- New
create method added to NyFormData class. This will allow you to create the form from the instance.
- Add
FormStyle to NyForm. This will allow you to set a global style for the form. It currently only supports TextField and NyFormCheckbox widgets.
- Ability to create custom validation rules in
NyForm's
- Added
refreshState to NyForm class. This will refresh the state of the form.
- Added new typedefs
FormStyleTextField and FormStyleCheckbox for handling custom styles in NyForm
- Added
clear method to NyForm class. This will clear the form.
- Added
clearField method to NyForm class. This will clear a specific field in the form.
- Update
setField and setData methods in NyForm class. This will now update the state of the form after setting the field.
- Small refactor to the
NyTextField class
- Refactor
NyFormCheckbox class to support global styles
FormStyle added to Nylo class
- Update pubspec.yaml
- Update default toast widget text style
- Remove default validation rule from
NyLoginForm
- Refactor
FormValidator class.
- To set a validation rule, you must now use
FormValidator.rule("email") instead of FormValidator("email")
- You can now join multiple validation rules. E.g.
FormValidator().minLength(5).uppercase() will check if the value is at least 5 characters long and has an uppercase letter.
- Fix autofocus on
Field's in NyForm
- Ability to create forms using slate packages
- Fix slight issue with NyForm when handling validation rules
- Update
validate helper in NyState to skip null values
- Add new Forms
NyFormCheckbox - This will create a checkbox form field
NyFormDateTimePicker - This will create a date time picker form field
- Refactor
NyFormData class
- pubspec.yaml dependency updates
- Fix
deleteAll() method in Backpack to not remove the nylo key
- Remove
deepLink required parameter for deep linking
- New
NyForm widget! Designed to help you create forms easier in your app.
- Fix password_v1 & password_v2 validation rule not working in all cases
- Update NyTextField to support different types of text fields
- Add
makeForm to MetroService class to create a form
- Update
EmailRule, URLRule to support null values
- Rename
PhoneNumberUsaRule to PhoneNumberUsRule
- Update
textFieldMessage on some validation rules
- Small refactor of
NyTextField widget. The copyWith contains new parameters.
- New
passwordViewable parameter added to NyTextField widget
- New
validateOnFocusChange parameter added to NyTextField widget
- Update
NyState to check when post frame is complete for a better user experience
- New
NyFormPicker Widget added to the library - This will create a bottom modal with a picker. It can be used in NyForm's and as a standalone widget.
- New
NyForm.login method added to NyForm class - This will create a login form
- Ability to add custom form casts to
NyForm class via Nylo. E.g. Nylo.addFormCasts({"my_cast": (value) => value.toString()});
- Update docs
- Update pubspec.yaml
- Add support for the
child parameter in NyStatefulWidget to be a Function that returns a State.
- Update pubspec.yaml
- Add await to
ErrorStack.init
- Update Error Stack to use
ErrorStackLogLevel.verbose (default)
- Update pubspec.yaml
- Add new extensions
labelSmall, labelMedium and labelLarge to Text widget
- Small refactor to
NyRichText widget
- Add
_errorStackErrorWidget to Nylo class
- Update pubspec.yaml
- Fix
MetroService not properly suffixing the file names
- Added
StorageConfig class to the library. This will allow you to set the storage configuration for your app.
StorageConfig.init(
androidOptions: AndroidOptions(
resetOnError: true,
encryptedSharedPreferences: false
)
);
- Set
NyRichText style color to Colors.black by default
- Added
loadJson method to helpers to load a json file
- Added
containsRoutes method to Nylo class. Now you can check if a route exists in your app. E.g. Nylo.containsRoutes(["/home", "/settings"])
- Fix
MetroService duplicating slate file names
- Update
NotEmptyRule Validation rules to include null, Map and List types
- Update pubspec.yaml
- Downgrade
flutter_secure_storage to 9.0.0
- Fix
NyState not receiving state updates
- New
stateReset method added to NyListView and NyPullToRefresh
- Add
StateAction.setState method
- Update
flutter_secure_storage
- Update pubspec.yaml
- Add
ErrorStack to the library
- New
useErrorStack helper added to Nylo. This will enable ErrorStack in your application.
- Update pubspec.yaml
- Update
confirmAction method in NyState to support more options
- Add
updateRouteStack to Nylo. This method will update the route stack with a new routes.
Nylo.updateRouteStack([
HomePage.path,
SettingPage.path
], dataForRoute: {
SettingPage.path: {"name": "John Doe"}
});
- Add
nylo.onDeepLink to listen for deep link events in your app.
nylo.onDeepLink((String route, dynamic data) {
print(data);
});
- Update
NyState to check that data is of Type Map before calling data[key]
- Update
NyPullToRefresh validate that the data is a List
- Update
NyListView validate that the data is a List
- Add the ability to set a custom transition to a
route.group e.g. router.group(() => {'transition': PageTransitionType.fade}, (router) { ... })
- Add the ability to set a transition_settings to a
route.group e.g. router.group(() => {'transition_settings': PageTransitionSettings(duration: Duration(milliseconds: 500)}, (router) { ... })
- Update
_getPageTransitionIsIos to detect if the platform is iOS to use the CupertinoPageRoute for the transition
- Small refactor to
_getPageTransition.* methods in router.dart
- Update pubspec.yaml
- New
NyAction class added to the library
limitPerDay method added to NyAction class - This will limit the number of times an action can be performed in a day.
authorized method added to NyAction class - This will check if the user is authorized to perform an action.
- Add extra parameters to
ListView for NyListView.grid
- Added
updateCollectionWhere to NyStorage class
- Added
footerLoadingIcon to NyPullToRefresh widget
- Remove
initializeDateFormatting call in Nylo and app_localization.dart
- Update
_loggerPrint not to print Exception if the message is empty
- Update
NyPullToRefresh
- Update pubspec.yaml
- Refactor app_localization.dart file. Breaking changes to the way you set up your app localization.
- Removed
languagesList parameter
- Removed
valuesAsMap parameter
- Update
NyListView to use default state management
- Added
router.add so you can create routes easier
- Change
NyApiService to use getter on interceptors
- Fix
MetroService not automatically adding routes to router
- Update pubspec.yaml
- Remove
Equatable from Model class
- Add
Equatable to Model class
- Fix
modelDecoders on NyStorage.addToCollection
- Added
sort method to NyPullToRefresh widget
- Added
sort method to NyListView widget
- New parameter
modelDecoders on NyStorage.read to define the model decoders when reading from storage
- New parameter
modelDecoders on NyStorage.readCollection to define the model decoders when reading from storage
- New parameter
modelDecoders on dataToModel to define the model decoders when reading from storage
- Remove
async from addModelDecoders method
- Added
router.group method
- Added
Future<void> wipeAllStorageData() to Nylo class. Usage Nylo.wipeAllStorageData()
- Added
scheduleOnceAfterDate(String name, Function() callback, {required DateTime date}) to Nylo class. Usage Nylo.scheduleOnceAfterDate('my_task', () => print('Hello'), date: DateTime.now().add(Duration(days: 1)))
- Added
scheduleOnceDaily(String name, Function() callback, {DateTime? endAt}) to Nylo class. Usage Nylo.scheduleDaily('my_task', () => print('Hello'), endAt: DateTime.now().add(Duration(days: 2)))
- Added
scheduleOnce(String name, Function() callback) to Nylo class. Usage Nylo.scheduleOnce('my_task', () => print('Run once'))
- Added
Future<DateTime?> appFirstLaunchDate() to Nylo class. Usage DateTime? dateTime = Nylo.appFirstLaunchDate()
- Added
Future<int> appTotalDaysSinceFirstLaunch() to Nylo class. Usage int days = Nylo.appTotalDaysSinceFirstLaunch()
- Added
Future<int?> appLaunchCount() to Nylo class. Usage int? count = Nylo.appLaunchCount()
- Added
Future<void> appLaunched() to Nylo class. Usage Nylo.appLaunched()
- Added
isSameDay(DateTime date) to DateTime extension
- Added new
NyAppUsage class to the library
- Added
monitorAppUsage() to Nylo class. Usage Nylo.monitorAppUsage() - This will start monitoring the app usage like the first launch date, total days since first launch, launch count and more.
- Added
showDateTimeInLogs() to optional show the date and time in logs
- Updated log method to add a ":" in-between log messages
- Fix
withGap extension for Column widgets
- Add new
toggleValue method for List's. This will toggle a value in a list. E.g. myList.toggleValue(10);
- Add new
toSkeleton() extension for Widget's
- New
NyScheduler class added to the library
- Add new
NyRichText widget
- Remove debug print statement
- New method
setSendTimeout added to NyApiService
- New method
setReceiveTimeout added to NyApiService
- New method
setConnectTimeout added to NyApiService
- New method
setMethod added to NyApiService
- New method
setContentType added to NyApiService
- Fix
NyTextField to use validationRules
- Update
Dio to 5.4.1
- Add
toTimeAgoString extension to DateTime
- Fix
onLanguageChange method in NyLanguageSwitcher
- Add
deleteFromCollectionWhere for NyStorage. E.g. NyStorage.deleteFromCollectionWhere((value) => value == 1, key: "myKey");
- Add
defaultValue on the match function
- New
StateAction class for handling state actions
- Add
NyTextField.emailAddress() widget - This will create an email address text field
- Add
NyTextField.password() widget - This will create a password text field
- Ability to set
passwordVisible on NyTextField widget
- Add
NyTextField.compact() widget - This will create a compact text field
- Add
password_v1 validation rule for checking if a password is valid
- Add
password_v2 validation rule for checking if a password is valid
- Fix
NyListView.grid Widget
- Ability to set a Grid view in
NyListView e.g. NyListView.grid()
- Ability to set a Grid view in
NyPullToRefresh e.g. NyPullToRefresh.grid()
- Change
getRouteHistory to return a list of the route history
- Change
getCurrentRouteArguments to return a map of the current route arguments
- Change
getPreviousRouteArguments to return a map of the previous route arguments
- Add
flutter_staggered_grid_view to pubspec.yaml
- Fix
_initLanguage method in app_localization.dart
- Add
NyLanguageSwitcher widget
- Add check in app_localization.dart to see if an existing language is set
- New
beforeRefresh method added to NyPullToRefresh widget
- New
afterRefresh(dynamic data) method added to NyListView widget
- Add
isMorning extension to DateTime
- Add
isAfternoon extension to DateTime
- Add
isEvening extension to DateTime
- Add
isNight extension to DateTime
- Update pubspec.yaml
- Add new
updateCollectionByIndex method in NyStorage class
- Add new
readJson method in NyStorage class
- Add new
storeJson method in NyStorage class
- Change
sleep to use seconds instead of milliseconds
- Rename
toJson to parseJson on String extension
- New
showInitialLoader property added to NyState class
- Add new
toDateTime extension for Strings
- Update pubspec.yaml
- Add new
toJson extension for Strings
- Add
useSkeletonizer to NyPullToRefresh widget
- Add
useSkeletonizer to NyListView widget
- Add
useSkeletonizer to NyFutureBuilder widget
- Update pubspec.yaml
- Small refactor to
NyRouteGuard class
- Add new
sleep helper
- Add
connectionTimeout to network helper
- Add
receiveTimeout to network helper
- Add
sendTimeout to network helper
- New parameter
baseOptions added to NyApiService constructor
- Set
Intl.defaultLocale in Nylo class
- Add
setRetryIf to DioApiService
- Add
retryIf to api helper
- Update
build method in NyState to Skeletonize the loading(BuildContext context) widget
- Add
queryParameters to routeTo helper
- Add
queryParameters to NyState helper
- Add
queryParameters to NyRequest class
- Add
queryParameters to onTapRoute helper
- Add
bottomNavFlag to Strings
- You can now set an API service as a singleton in your project.
- Add
setRetry to api helper
- Add
setRetryDelay to api helper
- Add
setShouldSetAuthHeaders to api helper
- Change
immortal to singleton in NyController
- Add new validation helpers:
- date_age_is_younger - usage e.g.
date_age_is_younger:18 - This will check if the date is younger than the given age.
- date_age_is_older - usage e.g.
date_age_is_older:30 - This will check if the date is older than the given age.
- date_in_past - usage e.g.
date_in_past - This will check if the date is in the past.
- date_in_future - usage e.g.
date_in_future - This will check if the date is in the future.
- Refactor
apiDecoders and apiControllers in Nylo class to support singletons.
- Tweaks to
MetroService to support singletons.
- Add
skeletonizer package to pubspec.yaml
- New
view(BuildContext context) method added to NyState class - This can be used to create the view for your widget.
- New
loading(BuildContext context) method added to NyState class - This can be used to create the loading widget for your widget.
- Update
max and min validation rules to now validate Strings, Numbers, Lists and Maps.
- Added more docs to NyApiService
isDebuggingEnabled added to Nylo class - This will check if the app is running in debug mode.
isEnvProduction added to Nylo class - This will check if the app is running in production mode.
isEnvDeveloping added to Nylo class - This will check if the app is running in development mode.
- New
dump function added for printing out data in a readable format.
- Add
skipIfExist to makeModel method in MetroService
- Change
languageCode to use locale in Nylo class
- Add metaData to
ToastMeta
- Update pubspec.yaml
- Fix
NyPullToRefresh widget not using the padding parameter
- Add new
locale variable to Nylo class - Use Nylo.locale to get the current locale.
- Add
isAgeYounger(int age) helper to DateTime extension - This will check if the DateTime is younger than the given age.
- Add
isAgeOlder(int age) helper to DateTime extension - This will check if the DateTime is older than the given age.
- Add
isAgeBetween(int min, int max) helper to DateTime extension - This will check if the DateTime is between the given ages.
- Add
isAgeEqualTo(int age) helper to DateTime extension - This will check if the DateTime is equal to the given age.
- Add locale to intl.DateFormat methods to allow you to set the locale of the date.
- Change
toTimeString to accept a withSeconds parameter
- Fix
toShortDate method
- New parameter added to
network called shouldSetAuthHeaders - This will tell the network method if it should set the auth headers or not. You can also override shouldSetAuthHeaders in your DioApiService class.
- Big updates to
DioApiService
network method now accepts a retry parameter - Set how many times you want to retry the request if it fails.
network method now accepts a retryIf parameter - A function to check if the request should be retried.
network method now accepts a retryDelay parameter - Set how long you want to wait before retrying the request.
- Three new methods added to
DioApiService:
refreshToken - Override this method to refresh your token.
shouldRefreshToken - Override this method to check if you should refresh the token.
setAuthHeaders - Override this method to set your own auth headers.
- Big updates to
MetroService to allow you to create files in sub folders.
- Update import paths to support a
creationPath when creating files in the project.
- Update
validate method inside NyPage to support the latest way of validating data.
- Add more docs to library
- New extension
hasExpired on DateTime object - This will check if the DateTime has expired. It's usage is for checking if a token has expired.
- Add queryParameters to
get method inside API Service
- Add intl package to pubspec.yaml
- Remove dead code in Router
- New
flexible helper added for Stateless and Stateful widgets, e.g. TextField().flexible()
- Add
showToastSorry method to NyState class
- Fix
addRouteGuard helper for routes
- Add
pop helper to controller
- New
is_type, is_true and is_false validation rules
- Implement Pull to refresh for empty data
- Introducing a new flag you can set in your controllers
bool immortal = true; this will allow your controller to live forever and not be disposed when the widget is removed from the tree.
- New
NyFader widget added, this widget allows you to add a gradient fade from the bottom/top/right/left of a widget.
- You can also use the
faderBottom, faderTop, faderLeft and faderRight helpers on a widget to add a gradient fade to the bottom/top/left/right of a widget.
- New
withGap extension added to Row and Column widgets to add a gap between children.
- NyState new helper method added
confirmAction, this will show a dialog to confirm an action.
- Breaking changes
- You can no longer set
appLoader as a variable in your Nylo class. You must now use the addLoader(widget) helper method.
- You can no longer set
appLogo as a variable in your Nylo class. You must now use the addLogo(widget) helper method.
- Use
Nylo.appLoader() to get the loading widget
- Use
Nylo.appLogo() to get the app logo
- Use
Nylo.isCurrentRoute(MyHomePage.path) to check if the current route matches the given route
- Set
apiDecoders using Nylo.addApiDecoders(apiDecoders)
- Navigator observers added to Nylo
- Get the observers using
Nylo.getNavigatorObservers()
- Add an observer using
Nylo.addNavigatorObserver()
- Remove an observer using
Nylo.removeNavigatorObserver(observer)
- Upgrade router
- Get the route history using
Nylo.getRouteHistory()
- Get the current route using
Nylo.getCurrentRoute()
- Get the previous route using
Nylo.getPreviousRoute()
- Get the current route name using
Nylo.getCurrentRouteName()
- Get the previous route name using
Nylo.getPreviousRouteName()
- Get the current route arguments using
Nylo.getCurrentRouteArguments()
- Get the previous route arguments using
Nylo.getPreviousRouteArguments()
- Add
loading parameter to NyPullToRefresh widget
- Add
loading parameter to NyListView widget
- New
NyThemeOptions added to store theme colors
- New
NyRouteHistoryObserver class for handling route history
- Ability to chain a
transition on a route e.g. router.route(DashboardPage.path, (_) => DashboardPage()).transition(PageTransitionType.bottomToTop)
- Ability to chain a
transitionSettings on a route e.g. router.route(DashboardPage.path, (_) => DashboardPage()).transitionSettings(PageTransitionSettings(duration: Duration(milliseconds: 500)))
- Ability to chain a
addRouteGuard on a route e.g. router.route(DashboardPage.path, (_) => DashboardPage()).addRouteGuard(MyRouteGuard())
- Ability to chain a
addRouteGuards on a route e.g. router.route(DashboardPage.path, (_) => DashboardPage()).addRouteGuards([MyRouteGuard(), MyRouteGuardTwo()])
- Ability to chain a
authRoute on a route e.g. router.route(DashboardPage.path, (_) => DashboardPage()).authRoute() // new auth route
- Ability to chain a
initialRoute on a route e.g. router.route(DashboardPage.path, (_) => DashboardPage()).initialRoute() // new initial route
- New
store() method added to String extension. E.g. await StorageKey.userToken.store("123");
- New
read method added to String extension. E.g. await StorageKey.userToken.read()
- New
addToCollection method added to String extension. E.g. await StorageKey.userToken.addToCollection("10");
- New
readCollection method added to String extension. E.g. await StorageKey.userToken.readCollection()
- Update
fromStorage and fromBackpack method to accept a default value. E.g. await StorageKey.userToken.fromStorage(defaultValue: "123");
- Add new
jsonFlag to metro constants
- New helper in
NyState called data() to get data from the state.
- A lot of new Extensions added to the package.
paddingOnly and paddingSymmetric added to the following widgets:
Text
Row
Column
Container
SingleChildRenderObjectWidget
StatelessWidget
- New
Image extensions added:
localAsset() can be used to load an image from your assets folder. e.g. Image.asset('my-image.png').localAsset() // load from assets folder
circleAvatar can be used to load an image as a circle avatar. e.g. Image.asset('my-image.png').circleAvatar()
- New
shadow extension added to Container widget. e.g. Container().shadow() or Container().shadowLg()
- New
onTap helper added to StatelessWidget e.g. Text('Hello').onTap(() => print('Hello'))
- New
onTapRoute helper added to StatelessWidget e.g. Text('Home Page').onTapRoute(HomePage.path)
- New extension
toMap on Iterable<MapEntry<String, dynamic>> to convert a list of MapEntry's to a Map.
NyStatefulWidget controller is now not nullable. You can call the controller like this widget.controller.myMethod().
- Add a mounted check in
NyState's validate helper.
- Slight change to the
network helper to now always accept new bearerToken passed into the method.
- Update the
data() method to accept a new key parameter. Now you can check for a key using widget.controller.data('my_key').
- Ability to set routes as the initial page and auth route in
MetroService
NyTemplate now contains a new options variable to set more meta data about the template
- Fix
MetroService not adding api services to the config file
- New
makeInterceptor helper added to MetroService.
- New NyPage helpers added to
NyController.
- Small refactor to NyPage class.
- Add
DioApiService class to the package.
- Add
state to Controller.
- Add more docs to methods/classes.
- Add dio and pretty_dio_logger to pubspec.yaml
- New
runProcess helper added to MetroService.
- New
addToTheme helper added to MetroService.
- Update the look for Toast Notifications
- Add new parameter setState on
refreshPage to set the state of the Widget.
- New helpers added to
NyPage
- context
- textTheme
- mediaQuery
- Improve regex to auto add classes and routes
- New
NyPage widget - Learn more here
- New helper for the Nylo class -
addControllers
- Improve Metro to auto add controllers when created
- Add more docs
- New extensions added to BuildContext:
- textTheme
- mediaQuery
- pop
- widgetWidth
- widgetHeight
- Fix typo in log
- update validator & updateState docs
- Ability to create config files
- Add
event_bus_plus to the library
- Update pubspec.yaml
- Add optional builder callback to the
route.generator() method. This can be used to override the default Widget returned.
- Update pubspec.yaml
- Fix nyColorStyle to use the correct theme color
- New helper to check if the device is in dark mode.
- Ability to set a default value on NyStorage
- Fix nylo-core/framework#35
- Ability to set a default value on
NyStorage.read
- Update pubspec.yaml
- Add new toast notification helpers to
NyState
- showToastWarning
- showToastInfo
- showToastDanger
- Fix toast_meta.dart style types
- New feature -
paginate through your List's, you can now call [1,2,3,4,5].paginate(itemsPerPage: 2, page: iteration).toList();
- New Widget -
NySwitch this widget allows you to provide a List of widgets and index for which should be the child widget.
- New paginate feature for the
nyApi helper. Now you can pass in a page like api<ApiService>((request) => request.listOfDataExample(), page: 1);. This will add a query parameter on your url like "my-example-site.com/todos?page=1".
- Remove
color helper from NyState
- Remove
stateInit from NyState
- Add
stateData to NyState
- Change afterLoad, afterNotNull and afterNotLocked to use
loading as the new parameter when you need to override the Loading widget.
- Ability to set custom toast notifications
- Refactor toast notifications
- Refactor addToCollection() method
newItem to item
- Add event_bus_plus to pubspec.yaml
- Add pull_to_refresh_flutter3 to pubspec.yaml
- Add new method
addEventBus to Nylo class
- Ability to use
lockRelease on the validate helper
- New widget -
NyPullToRefresh this new widget provides a simple way to implement pull to refresh on your list views.
- New widget -
NyListView this new widget provides a simple way to implement a list view.
- Change NyFutureBuilder to accept null in the
child callback
- New
updateState helper to allow your to update the state of a NyState from anywhere in your project
- Fix
syncToBackpack method
- New extension
fromBackpack on Strings - Allows you to read a model from your Backpack instance. E.g. User user = StorageKey.authUser.fromBackpack().
- Fix validation rule
numeric
- Improve
NyFutureBuilder to allow null types to be returned in the child(context, data) callback
- New
reboot method added to NyState, it will re-run your boot() method
- New route helpers
routeToAuth() & routeToInitial()
- New
afterNotLocked() method added to NyState.
- New helper added to
Nylo class initRoutes()
- Add generic type to
saveCollection() helper.
- add lang folder to constants
- fix issues from dart analyze
- Add new constants
- Fix Slate's when using
MetroService
- update git actions
- Add new method to MetroService
runCommand to replace command method in metro.
- Small refactor to extensions.dart file.
- Add new extensions for bool types
- Add generic type to
SyncAuthToBackpackEvent.
- Fix
NyLogger.json helper not formatting the output to JSON
- Add key parameter to
auth
- New parameter added to
NyTextField widget called handleValidationError - This new helper is a callback that can be used to handle any validation errors thrown
- New String extension
toHexColor() - This will convert your strings into a Color. Try it "DB768E".toHexColor()
- Fix
api helper not returning request data
- Added new extensions for
Text
- Router
authRoute added to redirect to a certain route when a user is authenticated
initialRoute added to set an initial route in your project
routeGuards added to 'guard' a route
- Add new NyTextField widget.
- New
Model class replaces Storable
- Auth
Auth.user() to find the authenticated user
Auth.set( User() ) to set an authenticated user
Auth.remove() to remove an authenticated user
Auth.loggedIn() to check if a user is logged in
- Change
validator in NyState to validate.
- Allow Nylo to accept custom validation rules from a project.
- Add to the
Backpack class new methods:
- auth to return the authenticated user
- isNyloInitialized to check if Nylo is initialized
- Backpack
read method will now accept a defaultValue parameter to be returned if no data is found.
- New helper methods:
- match - Matches
- nyHexColor
- nyColorStyle
nyApi will now accept NyEvents so the data returned from your API requests will be passed to the events.
- The
NyLogger class will now only log if the project's APP_DEBUG is set to true.
NyProvider class now has an afterBoot method which will be called after Nylo has finished 'booting'.
- Remove
Storable class
- New helper in MetroService
makeRouteGuard
- New Extensions added for objects
showNextLog() added to force a log to show when the APP_DEBUG var is set to false
- Remove
logger package
- DocBlocks added to some methods
- Pubspec.yaml dependency updates
- Version bump
- Flutter v3.10.0 fixes:
- Update: theme_provider package
- Change
NyFutureBuilder to a Stateless widget to fix refreshing data.
- Allow the
BaseThemeConfig class to accept generics.
- --dart-define variable change -
ENV_FILE_PATH is now ENV_FILE.
- Allow passing custom env file path
- Add logo to package
- Fix
syncToBackpack method
- Pubspec.yaml dependency updates
- Version bump
- Ability to set a baseUrl to a ApiService from the
nyApi helper.
- Fix
Nylo.init to call setupFinished if setup is null.
- New
NyFutureBuilder widget which is a wrapper around FutureBuilder. Docs coming soon.
- You can now pass a key into the
data variable.
- Update TextTheme styles for the
getAppTextTheme method.
- New
syncToBackpack() helper in the NyStorage class.
- Metro: Fix add page method
- NyStorage: New helpers to deleteAll from the
Backpack class.
- Backpack: New
delete & deleteAll methods.
- Version bump
- MetroService - new
addToRouter & addToConfig methods to allow you to manipulate config files.
NyTemplate class added for building pre-made templates.
- Helper added for the Backpack class to return an instance of
Nylo easier.
initialRoute added to Nylo class.
- New
boot() async {} added to NyState widget. If you override this method and call an async method, it will allow you to use the afterLoad(child: () => MyWidget()) helper to display a loader until the async method completes.
- Pubspec.yaml dependency updates
- Version bump
- Move
routeTo helper from NyState to Router.
- New
PageTransitionSettings class to pass transition settings such as Duration when using routeTo and the router.
- Version bump
- Add base theme config for theme management in Nylo
- Add theme colors for color management in Nylo
- New helper for NyState class to fetch colors easier
- Ability to add a duration for page transitions
- Pubspec.yaml dependency updates
- Version bump
- Merge PR from youssefKadaouiAbbassi that adds query parameters to the router e.g. "/my-page?hello=world" = {"hello": "world"}
- New optional parameter
inBackpack added to the store when using NyStorage class to also save to your Backpack instance
- Merge pull request #17 from @lpdevit to fix router navigation when using
transitionDuration
- Pubspec.yaml dependency updates
- Version bump
- New helpers added to NyState:
awaitData and lockRelease.
- Version bump
- Fix
nyApi helper not returning a value
- Remove resource flag
- New arguments for Nylo's
init method: setup, setupFinished
- Add init method for NyState class
- New helpers: nyEvent, nyApi and Backpack
- assert condition added to DefaultResponse class
- Revert new init method in Nylo
- Fix Nylo init method with router param
- Revert init change in NyState.
- New Metro command to create events in Nylo.
- bootApplication helper added.
- Small refactor to folder names
- New Metro command to create Providers in Nylo.
- New Metro command to create API Services in Nylo.
- NyProvider added as a base class for Providers.
- New helper method added to NyState
whenEnv
- Fix translations when supplying more than 1 argument
- Generic class for networking requests added
- Pubspec.yaml dependency updates
- Add @mustCallSuper for construct method
- Fix [BaseController] construct method
- override setState in NyState
- Upgrade to Dart 2.15
- Update toast notifications
- Refactor methods in localization
- New validator added to NyState. Allows you to validate data in widgets.
- Added toast notification helper
- Refactored localization class
- Ability to create themes and theme colors from Metro Cli
- Pubspec.yaml dependency updates
- Bug fixes
- Fix
updateLocale method
- Ability to add additional Router's to Nylo
- Add routes from NyPlugin
- NyState has new 'get' helpers for TextTheme and MediaQuery
- NyStorage 'read' method now returns more accurate data types if a type is not specified
- New template for NyPlugin's
- Added a MetroService and MetroConsole class for cli operations
- Pubspec.yaml dependency updates