material_async_button 2.0.2
material_async_button: ^2.0.2 copied to clipboard
Drop-in async wrappers for Flutter Material buttons. Adds a loading state, with theming via ThemeExtension and external control via a controller.
CHANGELOG #
2.0.2 #
Fixed #
- Buttons no longer shrink by a sub-pixel while loading. The default spinner
now sizes to the label's line-box height (the idle content's vertical
extent) rather than the raw
fontSize, which is shorter than the rendered line..iconbuttons takemax(iconSize, lineBox), text-only buttons take the line box, icon-only buttons keepiconSize(unchanged). The line box is measured with the ambientTextScaler, so the loading view also tracks text scaling.
2.0.1 #
Fixed #
- Icon-bearing buttons no longer shrink vertically while loading. The
default spinner sizes to the button's shape instead of always to the font
size:
iconSizeforIconAsyncButton,max(iconSize, fontSize)for the.iconconstructors (the idle row height), andfontSizefor text-only buttons (unchanged). Sizes are read from the button's resolvedIconTheme/DefaultTextStyle, so a per-widgeticonSizeand theme overrides flow through.
2.0.0 #
Breaking redesign. The button now does exactly one job — show a spinner while
onPressed is in flight — and stays out of error handling, success feedback,
and styling. State collapses to a single bool (loading), and the theme becomes
a pure complement to ButtonStyle.
Breaking #
- Loading-only: no success or error state. Removed
AsyncButtonStatusentirely (the state is now a plainbool isLoading), along withonSuccess,onError,successBuilder,errorBuilder,feedbackDuration,cooldownDuration,markSuccess,markError,haptic/HapticOn, andannounce/AsyncButtonAnnouncer/defaultAsyncButtonAnnouncer. An in-button error view is a Material anti-pattern; success is handled by what your action already does (navigate away, flip the label). Both belong to your state management, not the button. onPressedthrows now re-propagate. WhenonPressedthrows, the button returns to idle and re-throws so the error reachesFlutterError.onError/ yourrunZonedGuardedzone.controller.trigger()rethrows instead of completing normally.AsyncButtonControlleris now a read-onlyValueListenable<bool>(ChangeNotifier implements ValueListenable<bool>). There is no publicvaluesetter — drive it withtrigger()/reset()and observe withaddListener/ValueListenableBuilder<bool>. Builders receivebool isLoadinginstead of anAsyncButtonStatus.AsyncButtonThemecarries onlyloadingBuilder+transitionBuilder.AsyncButtonTheme.empty(spinner-only) is the sole baseline; removedAsyncButtonTheme.material(). It complementsButtonStyle— no styling.disabledflag →enabled(defaults totrue). Affirmative naming that pairs with a tear-offonPressed. Eitherenabled: falseoronPressed: nulldisables — both also no-op an externalcontroller.trigger().loadingChild(aWidget) →loadingBuilder(aWidgetBuilder) on both the widgets andAsyncButtonTheme.- Removed the loading-colour knobs (
loadingForegroundColor,material(loadingColor:)). The spinner inherits each button variant's foreground; recolour a single button viaAsyncButtonSpinner(color: ...).
Fixed #
- Loading never disables the button. It keeps the button's themed enabled
colours — being loading and being disabled are different things. The spinner
inherits the enabled foreground for free (no more greyed indicator); taps that
can't run are silently swallowed, and
onLongPressis gated off while busy. The button shows the disabled look only when explicitly disabled viaonPressed: null. .iconbuttons drop the icon while loading, rendering the spinner alone.
Improved #
- The default
AsyncButtonSpinnerderives its size from the ambient font size, so it matches the button's label instead of a fixed 16px. - Guarded against state changes on an unmounted button.
- Corrected the
flutterSDK constraint.
1.0.1 #
- Docs: use tear-off form (
onPressed: api.save) in README examples. - CI: split workflow into format/analyze/test/pana/example, add tag-triggered pub.dev publish via OIDC trusted publishing.
1.0.0 #
Initial release. Renamed from async_button_builder to material_async_button
with a redesigned, theme-aware API.