oh_my_flutter 0.26.0 copy "oh_my_flutter: ^0.26.0" to clipboard
oh_my_flutter: ^0.26.0 copied to clipboard

Empower Flutter with utilities that make development 10x faster.

0.26.0 #

  • Breaking: Replace SkeletonStyle.radius with SkeletonStyle.shape. Rectangular bones accept any Flutter ShapeBorder, including bounds-aware capsules.
  • Add MorphNode to configure a child widget's projection, transition, and paint order during a matching Morph flight.
  • Make country-aware phone-number fields respond faster during ordinary typing and deletion while retaining the same formatting.
  • Add PulseFadeMotionEffect for a continuous breathing fade with configurable minimum opacity.
  • Let Skeleton animate between its loading shapes and content with an opt-in crossfade or a custom transition.
  • Breaking: Configure SkeletonDescendantBehavior with paintAsBone(), deferToChildren(), or hide() constructors instead of enum values. paintAsBone(builder: ...) draws a custom widget for one loading branch while retaining the original content and automatic bones elsewhere.
  • Add RouteListener for reacting to route settlement without changing child visibility or layout.
  • Keep SnapList trailing content ready to scroll in after the final item without a paint jump. Respect clipBehavior and apply only the supplied item transitions.
  • Breaking: SnapList transition builders receive SnapListTransitionDetails instead of the isReverse boolean. Read details.isReverse for direction, details.isTrailing for the trailing child, and details.involvesTrailing to customize effects on either side of a trailing reveal.

0.25.0 #

  • Jump directly to any SnapList item without animation using SnapListController.jumpTo(index).
  • Breaking: Configure descendant images with MorphDescendantFlightBehavior.snapshot(changes: notifier) instead of MorphDescendant.snapshotChanges. Flight behaviors now use live(), snapshot(), and hide() constructors.
  • Add independent MorphTarget.reverseDuration and reverseCurve timing for local returns and route pops, including navigation that reverses before its Morph flight finishes. Direction changes retain their visible state while beginning the newly selected curve.
  • Breaking: Move watchDestination from Morph to MorphTarget. Enable it on the shared target when either endpoint can move while it is the current destination; watching now applies to that connection in both directions.
  • Breaking: Replace the unnamed PhoneNumber constructor with parse and tryParse, require explicit international input beginning with +, and add isValid for checking current country numbering-plan prefixes.

0.24.0 #

  • Keep watched Morph destinations coherent when layout or inherited values change during a flight. Geometry, custom properties, grouped pixels, and descendant snapshots now refresh together before paint-confirmed handoff, while avoiding redundant group capture work and excess image overlap. Completed handoffs also retire retained overlay layers before releasing captured pixels, and nested flights remain until shared ancestor handoffs complete, preventing grouped content from flashing after route pops. Rapid route reversals now reclaim flight paint ownership before cancelling a pending endpoint handoff, so a settled destination cannot remain duplicated behind its returning flight.

  • Breaking: Morph appearances now share the same MorphTarget instance through ordered targets alternatives. Move duration and curve to the target; omitted values retain ancestor timing inheritance. canMatch checks each proposed connection once; appearances can further restrict their alternatives with Morph.canMatch, and custom delegates can select visuals through MorphEndpointContext.target. Observe navigation through the target status listenable instead of MorphNavigatorObserver.tagStatus. Remove MorphSibling and animateChildChanges; use delegate-managed group snapshots for accompanying content and Flutter's animation widgets for local child changes. Unrelated routes stay visible behind transparent destinations.

  • Add DeviceLocale.getCountry() and Device.locale to read the configured country on Android, iOS, macOS, and Windows, returning null when unavailable.

  • Add DeviceSim.getCountry() and Device.sim to read Android’s default SIM provider country as Country, returning null when unavailable.

  • Add InteractiveSwipeDismiss.canStartDrag to block body and handle drags before movement while keeping descendant interactions available.

  • Use updated phone metadata for parsing and display formatting.

  • Add PhoneNumberTextInputFormatter for immutable country-aware national formatting, explicit international-value and country results, international pastes, as-you-type grouping, and supported length limits while editing phone-number fields.

0.23.0 #

  • Breaking: Rename MorphEndpointContext.registerDescendantWidget to descendantWidget and registerGroupSnapshot to groupSnapshot.

  • Add Group, GroupLink, and disposable GroupSnapshot for measuring and capturing separately placed widgets together. Custom Morph flights can use groupSnapshot to carry the group while preserving nested Morphs and capturing its resolved layout before the flight begins.

  • Add independent SnapList.incomingTransitionBuilder and outgoingTransitionBuilder effects through scroll-driven Animation<double> values for Flutter transition widgets, with backward navigation context and reduced-motion support. Active item motion resolves to its destination before the list becomes inactive.

  • Breaking: Remove SnapList.viewportFraction. Remove this argument from constructor calls; items now fill the padded viewport along the scroll axis.

  • Preserve SnapList children with global keys without duplicate-key errors.

  • Reduce crowding between Skeleton text placeholders with baseline-aligned bars while preserving text layout and widths.

  • Accept complete international phone identifiers with possible country-specific lengths even when their prefixes are not allocated by a carrier, including service-managed WhatsApp test recipients.

0.22.0 #

  • Add SnapList with horizontal and vertical snapping, eager and lazy children, configurable item sizing and motion, adjacent navigation, automatic nested scrolling handoff, and measured trailing content.

  • Add InteractiveSwipeDismiss.onPositionChanged to follow every change to the child's actual offset and directional fraction of its size during dragging and return motion.

  • Inspect shared-element navigation through MorphNavigatorObserver.maybeOfNavigator and tagStatus. Read or listen for pending, unmatched, flying, completed, and cancelled results to choose a normal route transition when a shared flight is unavailable. Use MorphScope(enabled: false) to prevent new flights in a subtree while preserving ongoing transitions.

  • Keep swipe dismissal tied to the gesture's initial direction. Sideways and opposite starts report their entire drag as overdrag and cannot turn into a dismissal until the finger lifts and starts again.

  • Add optional InteractiveSwipeDismiss.onOverdrag to report raw movement outside the dismissal direction, including diagonal pulls and scroll-edge handoff. Consumers own the visual response; free drag bypasses notifications.

  • Breaking: Rename InteractiveSwipeDismissDragConfig.dismissThreshold to dismissFraction. Dismissal distance now uses the wrapped child's size, captured at gesture start, instead of the screen size.

  • Configure swipe dismissal return motion with returnCurve and returnDuration in InteractiveSwipeDismissDragConfig. Existing defaults remain linear over 260 ms.

  • Breaking: Custom Morph delegates now receive MorphFlightProgress in lerpProperties instead of a numeric progress argument. Use progress.curvedProgress to preserve existing interpolation, or progress.uncurvedProgress for independent content timing. The context also exposes flightKind and animationStatus, and keeps interrupted flights consistent with their visible content. Direct calls and MorphChildFlightDelegate.lerp also require the new context.

0.21.0 #

  • Breaking: Morph now uses stable MorphTarget instances and a MorphNavigatorObserver on each owning Navigator. Replace tag on Morph and MorphSibling with target; use separate targets with equal tags for each appearance and share the exact target with its siblings. Mounting and removal automatically transfer the shared visual, including returns and interrupted transitions. Sibling progress follows its appearance in both directions and stays visible during child-only replacement. Child updates are now immediate by default; set animateChildChanges: true to enable in-place child-replacement flights. Move flight configuration to flightConfig: MorphFlightConfig.auto(...) or .custom(delegate); use childSwitchAt and childTransition for automatic content changes. Custom flights expose curvedAnimation and uncurvedAnimation; rename delegate lerp to lerpProperties, register endpoint content with endpoint.descendantWidget(...), and build the returned widget. Snapshot content remains available during keyed endpoint replacement, including in custom crossfades. Independently timed returns stay visually settled above a closing modal barrier until it disappears, avoiding a brief color flash at landing. Sibling builders receive child, curved, and uncurved animations. Rename MorphSibling.paintAboveMorph to paintOnTop.
  • Add SafeAreaObserver and SafeAreaObserverHandle to measure local unsafe edge overlap and observe changes without moving or padding content.

0.20.0 #

  • Add MaybeSafeAreaHandle to read corrected bounds and observe changes, including adjustments caused by moving ancestors.
  • Breaking: Make an explicit or inherited Morph.duration control route flights, allowing shared visuals to finish before or after page transitions while fully omitted route durations continue following the route animation.
  • Add Country for country and territory identifiers, including established ISO extensions, primary calling codes, strict or nullable lookups, and offline localized display names with broad locale support.
  • Keep MaybeSafeArea content correctly positioned and clipped in offscreen snapshots, including Morph transitions.

0.19.0 #

  • Breaking: Replace Telephony with a validated PhoneNumber value that provides display and canonical E.164 forms and calls its constructor number.
  • Breaking: Reshape Whatsapp into a validated recipient value that owns a phone number or username, formats it for display, and opens chats through chat instead of launchChat.
  • Add StringExtension.isDigitsOnly for identifying non-empty strings that contain only ASCII digits.
  • Breaking: Remove the estimate option from DeviceDisplay.cornerRadii(). Display corners now come only from Flutter, Android platform information, or public iOS 26 UIKit information and return null when trustworthy values are unavailable.
  • Add DoubleExtension.isPositiveFinite for identifying finite double values that are strictly greater than zero.

0.18.0 #

  • Add NativeSelectableText for selectable plain or styled Flutter text with native selection menus on Android, iOS, macOS, Windows, and Linux, plus an adaptive Flutter fallback when native presentation is unavailable.

0.17.0 #

  • Add ScaleOutMotionEffect for scaling widgets and text from their normal size to a configurable final scale with standard Motion timing, playback, and lifecycle controls.

0.16.0 #

  • Add InteractiveSwipeDismiss for translating any live content with a configurable, scroll-aware directional dismissal gesture, callback-owned removal, and presentation-neutral drag-handle regions.
  • Breaking: Replace MorphForeground with tagged MorphSibling controls that coordinate widgets outside a Morph subtree through matching visual progress, rebuild-stable custom transitions, and configurable above-Morph paint ordering.
  • Keep watched Morph destination snapshots aligned with geometry and content changes during active forward and reverse flights while reusing unchanged images whenever changes are directly observable.
  • Keep retained Morph text and Column layout aligned with the paragraph's actual wrapping when a flight reverses before settling.
  • Prevent translucent Morph content from darkening while completed flights hand off to their live endpoints.
  • Add Device for grouping device features and DeviceDisplay for reading exact display corner radii with an optional approximate phone fallback.

0.15.0 #

  • Add device-formatted current addresses with selectable nullable components, retained coordinates, an optional best-effort locale, and a bounded reverse-geocoding wait, while keeping DeviceLocation implementable for consumer test doubles.

0.14.0 #

  • Breaking: Make Skeleton represent the first visibly painted descendant on each branch as one bone, and add nested SkeletonDescendant behaviors for painting a branch root, deferring to its children, or hiding it while retaining layout.

0.13.0 #

  • Breaking: Rename ControlledVisibilityController to VisibilityController.
  • Add a generic callable Debouncer<T> for delaying repeated synchronous or asynchronous callbacks, sharing the latest pending result, discarding superseded running results by default, and explicitly cancelling or disposing active results.

0.12.0 #

  • Add Skeleton for turning existing widget layouts into neutral loading placeholders with optional fade and shimmer effects, configurable rectangular radius and effect timing, and a localized live loading-status label.
  • Keep multiline Morph text fully visible and following Column content correctly positioned and spaced while typography grows or shrinks, with children corresponding by position regardless of their Flutter keys.
  • Prevent shrinking reverse Morph transitions from leaving duplicated text from earlier frames.

0.11.1 #

  • Add DeviceLocation for managing foreground permission and settings and retrieving fresh Android or iOS coordinates. This release requires Flutter 3.47 and Dart 3.13.

0.11.0 #

  • This version was tagged but not published.

0.10.0 #

  • Preserve visual continuity when Morph transitions overlap or hand their completed flight to a live endpoint, including route reversals and retargets.
  • Add configurable live or preserved MaybeSafeArea positioning so controls can either track unsafe edges while moving or retain their initial correction within a moving surface.

0.9.0 #

  • Add MorphForeground for keeping live controls and other content visible above nearby Morph transitions without joining their animation.

0.8.2 #

  • Keep RouteSettled content hidden while another route covers it, then replay its configured show behavior after that route fully leaves.

0.8.1 #

  • Make the repository's consumer guides easier to discover from the README, alongside the generated API reference and runnable example.

0.8.0 #

  • Add MaybeSafeArea to keep a child's layout bounds out of enabled unsafe view edges as it moves or scrolls, without changing layout or delaying its first rendered frame.

0.7.1 #

  • Fix nested Morphs without a matching endpoint in the current transition so they remain visible as ordinary content inside their ancestor's flight.

0.7.0 #

  • Breaking: Extend automatic Morph transitions with MorphDescendant configuration for how selected subtrees participate in their nearest Morph, including live, snapshotted, or hidden flight behavior; optional transitions for discrete content switches; destination tracking configured by the departing Morph; and specialized transitions through eligible Motion wrappers. Rename Morph.watch to watchDestination and nonMorphDescendantsTransition to switchTransition.

0.6.1 #

  • Add Morph shared-element transitions for any widget across routes or within the same screen. Eligible Text, Container, DecoratedBox, and vertical Column pairs receive specialized transitions automatically, while other pairs use the generic content switch. Nested Morphs inherit an omitted duration or curve from their nearest Morph ancestor. Custom typed flight delegates remain available when needed.
  • Reorganize package documentation into focused consumer guides for widgets, extensions, networking, and utilities, with a compact README catalog that links to each documentation section.
  • Add configurable MotionStartup behavior and MotionController playback for Motion and TextMotion, including automatic playback, a held starting state, or a skipped ending state with controller-driven playback on demand.
  • Add ShakeMotionEffect for damped horizontal, vertical, or diagonal shakes with configurable strength, excursion count, timing, and playback.
  • Add MotionEffectBounds for declaring translation and scale ranges for custom effects with oscillating, abrupt, or short-lived visual extremes.

0.5.0 #

  • Breaking: Replace MotionEffect.buildTransition with MotionEffect.apply. Custom effects now use MotionEffectTransform to compose opacity, translation, and uniform scale. The same custom effect can be used by both Motion and TextMotion.
  • Add TextMotion and TextMotion.list for applying existing motion effects to the visible Unicode graphemes in plain Flutter text, with configurable staggering and effect lifecycle callbacks for the complete text.
  • Add Marquee for continuously moving an ordered widget strip in any physical direction, with bounded or explicit viewport sizing, configurable loop duration and spacing, continuous repetition through infinity, reduced-motion handling, and opt-in interaction.

0.4.1 #

  • Add effect-level onStart and onEnd lifecycle callbacks to MotionEffect, with onStart on every built-in effect and onEnd on one-shot effects.
  • Keep Motion interaction disabled during effect delays when interactive is false.
  • Add MotionPlayback.isOnce for semantic playback branching.

0.4.0 #

  • Add extensible single- and multi-effect Motion composition with one-shot and looping playback, including independent per-effect startup delays, the built-in FadeInMotionEffect, ScaleInMotionEffect, paint-only MoveMotionEffect and FloatingMotionEffect, reduced-motion handling, a shared frame scheduler, optional interaction blocking during playback and render-layer transforms.
  • Add PauseAnimations for muting subtree ticker callbacks either explicitly or for a fixed duration.
  • Add controller-driven Sequence for displaying ordered widgets one at a time, with indexed navigation, optional directional transitions, and configurable child-state retention. Its lazy entry lifecycle limits mounted and animated work to participating children by default, while configurable alignment anchors differently sized transition participants.

0.3.2 #

  • Remove the root package lockfile from version control.

0.3.1 #

  • Align the package's explicit formatter settings with pana so local and publication analysis both pass at the configured 120-column width.

0.3.0 #

  • Add controller-driven ControlledVisibility with independent caller-owned show and hide transitions, configurable timing, reduced-motion handling, and mounted or unmounted hidden-state behavior.
  • Add RouteSettled for showing route content only after navigation motion and user gestures finish, with optional direction-specific transitions.
  • Improve pubspec description.

0.2.0 #

  • Breaking: Remove StringExtension.hexToColor(). Use Flutter Color constructors or an application-owned parser for string input.
  • Improve the README, example, and public API documentation.
  • Add trusted pub.dev publishing through GitHub Actions.
  • Use the canonical Ventairy repository links in package metadata.

0.1.0 #

  • Initial public release.
  • Add deterministic relative-time formatting with configurable fallback behavior.
  • Add color, OKLCH, string, object, and gesture velocity extensions.
  • Add offline Dio interception and a typed offline connection exception.
  • Add portable telephony and WhatsApp URI helpers.