WindAnimationWrapper
WindAnimationWrapper wraps any widget in a looping animation driven by WindAnimationType: spin, ping, pulse, or bounce. It is the
underlying engine behind animate-* utility classes; you can also use it directly when you need programmatic control over the type,
duration, or curve.
Table of Contents
Basic Usage
WindAnimationWrapper(
animationType: WindAnimationType.spin,
child: WIcon(Icons.refresh_outlined, className: 'text-blue-500 dark:text-blue-400 text-3xl'),
)
Use animate-* className tokens for most cases. Reach for WindAnimationWrapper directly when you need to vary duration or curve at
runtime, or when wrapping a widget that does not accept a className prop.
Constructor
const WindAnimationWrapper({
Key? key,
required Widget child,
required WindAnimationType animationType,
Duration duration = const Duration(milliseconds: 1000),
Curve curve = Curves.linear,
})
Props
| Prop | Type | Default | Description |
|---|---|---|---|
child |
Widget |
Required | The widget to animate. |
animationType |
WindAnimationType |
Required | The animation style. One of spin, ping, pulse, bounce, or none. |
duration |
Duration |
Duration(milliseconds: 1000) |
Full cycle length. Applies to all animation types. |
curve |
Curve |
Curves.linear |
Easing curve for the animation controller. Note: ping and pulse apply their own CurvedAnimation internally; curve primarily affects spin and bounce. |
Animation Types
WindAnimationType |
Effect | Typical use |
|---|---|---|
spin |
Continuous 360-degree rotation. | Loading spinners, refresh icons. |
ping |
Scale from 1.0 to 1.5 with matching opacity fade, repeating. | Notification badges, live indicators. |
pulse |
Opacity oscillates from 1.0 to 0.5 and back. | Skeleton placeholders, content loading. |
bounce |
Vertical offset oscillates between 0 and -5 px (20 * 0.25). | Scroll indicators, attention grabbers. |
none |
No animation; returns child unchanged. |
Default state; safe to pass unconditionally. |
Styling Examples
Custom duration
Slow a pulse down to a 2-second cycle for a calmer skeleton effect:
WindAnimationWrapper(
animationType: WindAnimationType.pulse,
duration: const Duration(milliseconds: 2000),
child: WDiv(
className: 'h-4 w-48 bg-gray-200 dark:bg-gray-700 rounded',
),
)
Ping badge
Combine with Stack + Positioned for a notification badge:
Stack(
children: [
WIcon(Icons.notifications_outlined, className: 'text-gray-600 dark:text-gray-300 text-3xl'),
Positioned(
right: 2,
top: 2,
child: WindAnimationWrapper(
animationType: WindAnimationType.ping,
child: WDiv(className: 'w-3 h-3 bg-red-500 dark:bg-red-400 rounded-full'),
),
),
],
)
Spin with fast duration
Reduce the cycle time for a snappier loading indicator:
WindAnimationWrapper(
animationType: WindAnimationType.spin,
duration: const Duration(milliseconds: 600),
child: WIcon(Icons.sync_outlined, className: 'text-indigo-500 dark:text-indigo-400 text-2xl'),
)
Via className (most common)
For typical use the animate-* className token is the shorter path:
WIcon(
Icons.refresh_outlined,
className: 'text-blue-500 dark:text-blue-400 text-2xl animate-spin',
)
Related Documentation
- WDiv: Universal container; supports
animate-*viaclassName. - WIcon: Icon widget; wraps automatically in
WindAnimationWrapperwhen className containsanimate-*. - Animation: Full reference for the
animate-*tokens. - Transition: Reference for
transition-*,duration-*, andease-*tokens.