NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #1683 most downloaded on pub.dev
An expressive way to effortlessly build design systems in Flutter.
Last release 7 days ago
01 Oct 2026
Ships fairly regularly
a new release about every 4 weeks
Nearly every release is documented
notes for 34 of 35 stable releases
Nothing withdrawn
no release was ever pulled
5 years old
68 releases · first in 2021
One column per quarter.
Co-authored-by: Claude Opus 5 (1M context) noreply@anthropic.com
Co-authored-by: Claude Opus 5 (1M context) noreply@anthropic.com
linearGradient, radialGradient,
sweepGradient, and their foreground*Gradient counterparts (plus the
generated BoxStyler, FlexBoxStyler, StackBoxStyler, and WrapBoxStyler
factories) now accept an optional GradientTransform transform, so a
gradient can be rotated, for example
.sweepGradient(colors: colors, transform: GradientRotation(angle)), without
switching to gradient(SweepGradientMix(...)). The parameter is optional and
existing calls are unchanged.BlurModifier, BlurModifierMix, and the
WidgetModifierConfig.blur factory and instance method now accept an optional
TileMode tileMode, carried through the protocol as well. The parameter is
optional and defaults to the previous TileMode.clamp behavior, so existing
calls are unchanged.Co-authored-by: Claude Opus 5 (1M context) noreply@anthropic.com
Co-authored-by: Claude Opus 5 (1M context) noreply@anthropic.com
Stable release of the 2.2.0 line, cumulative over the 2.2.0-beta.0 through
2.2.0-beta.6 prereleases. This release adds the GridBox and WrapBox layout
families, a typed and extensible context-variant system with focus-visible
support, a fuller Pressable input and semantics surface, and complete
WidgetModifierConfig convenience APIs; it fixes variant merge priority and
nested widget-state discovery, and it carries breaking changes to Pressable
and to GridBox implicit rows.
GridTrack, GridBoxSpec, GridBoxStyler, and
GridBox API with fixed/fractional tracks, explicit and repeated rows, gaps,
row-major placement, clipping, and local Breakpoint-based constraint
branches. Equal fractional columns use equalColumns; numeric tracks and
gaps support Mix tokens; compatible geometry participates in implicit style
animation. GridTrack.auto() adds content-sized row tracks for rows and
autoRows: an auto row sizes to its tallest child's natural height at the
resolved column width, then stretches shorter children to fill the row. auto
is vertical-only; columns rejects it.WrapSpec, WrapStyler, WrapBoxSpec,
WrapBoxStyler, and WrapBox family with flattened fluent Wrap styling,
collision-safe Box/Wrap names, generated constructors and factories, and a
runnable gallery example.WidgetModifierConfig convenience APIs: mouseCursor and
scrollView are now available as factories and chain methods, and skew,
defaultIcon, iconTheme, box, and reset gained the chain methods their
factories were missing. Every built-in modifier can now be reached without
.modifier(SomeModifierMix(...)), for example
BoxStyler().wrap(.mouseCursor(SystemMouseCursors.click)). The chained
reset() clears the modifiers accumulated in that configuration only; use the
WidgetModifierConfig.reset() factory when the reset must also clear the
configuration it is merged into.ContextVariant.widgetStateDependencies: Context variants now declare the
widget states they read, so custom variants participate in nested dependency
discovery instead of relying on the framework recognizing a specific variant
type. Automatic self-tracking is limited to pointer-driven hover and press;
other states still require an ancestor scope or external controller.FocusVisibleVariant,
ContextVariant.focusVisible(), and onFocusVisible(...), which apply while
focus is highlighted in Flutter's traditional (keyboard/directional) mode.PressableSemanticsRole with button,
link, and neutral roles. PressableBox now forwards the full Pressable
focus, keyboard, controller, feedback, cursor, action, and semantics surface.BrightnessVariant, BreakpointVariant,
OrientationVariant, DirectionalityVariant, PlatformVariant,
WebVariant, and NotVariant are now public value objects behind their
ContextVariant factories, giving schema and tooling code stable typed data
to inspect instead of parsing keys.WidgetStateStyleOverride lets tooling and
tests force widget-state variants through normal style resolution, taking
precedence over controllers and nested interaction providers without
changing component behavior.StylerFieldMetadata.$stylerFieldNames, allowing schema tooling to validate
coverage without maintaining duplicate string manifests. Handwritten and
previously generated Stylers do not implement this capability until they opt
in or are regenerated.CssKeywordLinearTransform: Adds a reusable bounds-aware
GradientTransform for CSS linear-gradient keyword directions, so Tailwind
corner gradients can round-trip through schema tooling without losing visual
parity.semanticButtonLabel with
semanticsLabel, added semanticsRole, and removed the deprecated onKey
callback. Use onKeyEvent for custom keyboard handling.onKeyEvent. onPress still honors ActivateIntent dispatched
by remapped shortcuts or programmatic invocation, and custom actions can
override that binding or handle other intents. Only those five reserved keys
are claimed raw; they are left untouched when a descendant holds focus, and
modified chords are left to application shortcuts. A link-role Pressable
activates with Enter but leaves Space available for scrolling.autoRows no longer throws: Children needing more rows
than were declared previously required an explicit autoRows track, or the
Grid threw. Omitted autoRows now defaults to GridTrack.auto(), so
implicit rows size to their tallest child — both when no rows are declared
and when explicit rows run out. Fractional rows still require a bounded
height, and fixed tracks remain hard constraints. If you relied on the throw
to catch an under-declared Grid, declare rows explicitly or set autoRows
to the track you want repeated.ContextVariant.widgetStateDependencies rather than by whether they are a
WidgetStateVariant, so onFocusVisible(...) competes by declaration order
instead of always losing to any widget-state variant sharing a property, which
had been silently replacing focus rings. Variants built on
ContextVariant.not(...) move with their inner variant, so onEnabled(...)
now outranks an ambient variant such as onDark(...) declared after it.List.sort, which fell back to an unstable
quicksort at 32 elements and could reorder equal-priority variants in styles
that large.Style.widgetStates now discovers state
requirements recursively through nested and negated context-variant branches
with identity-based cycle protection, so variants like
onDark(BoxStyler().onHovered(...)) and onEnabled(...) are tracked instead
of silently never activating. Branches under un-applied named variants are
deliberately not tracked because they cannot activate until applyVariants
hoists them to the top level.StyleBuilder now
installs its pointer-interaction detector only for the states that detector
actually drives (hovered/pressed). States such as disabled and focused
can only come from an external WidgetStatesController or an ancestor scope,
so styles depending solely on those no longer gain an opaque hit-test target
that swallowed pointer events aimed at widgets beneath them, and no longer
hijack the state scope of descendants that do track hover.onFocusVisible also resolves — and repaints on input
modality changes — outside a Pressable. A WidgetStateStyleOverride forcing
focused now applies it too, matching onFocused.Variant.key. Equivalent
named, enum-backed, and built-in context variants still coalesce, while
unrelated variants with the same label retain their own predicates. Dynamic
builders keep their existing build-then-merge behavior and use function
equality instead of a hash string for merge identity.ContextVariant.brightness,
ContextVariant.breakpoint, ContextVariant.orientation,
ContextVariant.directionality, ContextVariant.platform,
ContextVariant.web, and ContextVariant.not now compare by their typed
values instead of identity, so equivalent variants deduplicate and
round-trip predictably.DefaultTextStyleModifierMix
overrides now merge with the ambient DefaultTextStyle instead of replacing
inherited text style fields.BoxShadowMix now preserves non-default
BoxShadow.blurStyle values across construction, conversion, merging,
resolution, diagnostics, equality, and its fluent and factory APIs (#992).tokenFromReferenceValue is now public for schema/tooling code that needs
to identify unresolved token references, including sentinel-backed
DoubleRef values, without importing Mix internals.Complete WidgetModifierConfig convenience APIs: mouseCursor and scrollView as factories and chain methods, plus the chain methods skew, defaultIcon, i
Complete WidgetModifierConfig convenience APIs: mouseCursor and scrollView as
factories and chain methods, plus the chain methods skew, defaultIcon,
iconTheme, box, and reset were missing. Additive only; no migration needed.
WidgetModifierConfig convenience APIs: mouseCursor and
scrollView are now available as factories and chain methods, and skew,
defaultIcon, iconTheme, box, and reset gained the chain methods their
factories were missing. Every built-in modifier can now be reached without
.modifier(SomeModifierMix(...)), for example
BoxStyler().wrap(.mouseCursor(SystemMouseCursors.click)). The chained
reset() clears the modifiers accumulated in that configuration only; use the
WidgetModifierConfig.reset() factory when the reset must also clear the
configuration it is merged into. Existing factories and chain methods are
unchanged, and .modifier(...)/.modifiers([...]) remain the entry points
for custom modifiers.Content-sized GridTrack.auto() row tracks; omitted GridBox autoRows now defaults to auto instead of throwing (breaking). Generated Styler field metada
Content-sized GridTrack.auto() row tracks; omitted GridBox autoRows now
defaults to auto instead of throwing (breaking). Generated Styler field
metadata via StylerFieldMetadata.$stylerFieldNames.
GridTrack.auto(): Content-sized row tracks for rows and autoRows.
An auto row sizes to its tallest child's natural height at the resolved
column width, then stretches shorter children to fill the row. Use it — or
omit autoRows — when child heights are unknown, such as a card grid in a
scroll view. auto is vertical-only; columns rejects it. Grids built only
from fixed and fr tracks are unaffected and still lay each child out once.StylerFieldMetadata.$stylerFieldNames, allowing schema tooling to validate
coverage without maintaining duplicate string manifests. Handwritten and
previously generated Stylers do not implement this capability until they opt
in or are regenerated.autoRows no longer throws: Children needing more rows
than were declared previously required an explicit autoRows track, or the
Grid threw. Omitted autoRows now defaults to GridTrack.auto(), so
implicit rows size to their tallest child — both when no rows are declared
and when explicit rows run out. Fractional rows still require a bounded
height, and fixed tracks remain hard constraints. If you relied on the throw
to catch an under-declared Grid, declare rows explicitly or set autoRows
to the track you want repeated.Variant merge priority follows declared state dependencies: Priority now groups active variants by whether they declare ContextVariant.widgetStateDepe
ContextVariant.widgetStateDependencies rather than by whether they are a
WidgetStateVariant, so onFocusVisible(...) competes by declaration order
instead of always losing to any widget-state variant sharing a property, which
had been silently replacing focus rings. Variants built on
ContextVariant.not(...) move with their inner variant, so onEnabled(...)
now outranks an ambient variant such as onDark(...) declared after it.List.sort, which fell back to an unstable
quicksort at 32 elements and could reorder equal-priority variants in styles
that large.Pressable input and semantics: Replaced semanticButtonLabel with semanticsLabel, added semanticsRole, and removed the deprecated onKey callback. Use o…
ContextVariant.widgetStateDependencies: Context variants now declare the
widget states they read, so custom variants participate in nested dependency
discovery instead of relying on the framework recognizing a specific variant
type. Automatic self-tracking is limited to pointer-driven hover and press;
other states still require an ancestor scope or external controller.FocusVisibleVariant,
ContextVariant.focusVisible(), and onFocusVisible(...), which apply while
focus is highlighted in Flutter's traditional (keyboard/directional) mode.PressableSemanticsRole with button,
link, and neutral roles. PressableBox now forwards the full Pressable
focus, keyboard, controller, feedback, cursor, action, and semantics surface.semanticButtonLabel with
semanticsLabel, added semanticsRole, and removed the deprecated onKey
callback. Use onKeyEvent for custom keyboard handling.onKeyEvent. onPress still honors ActivateIntent dispatched
by remapped shortcuts or programmatic invocation, and custom actions can
override that binding or handle other intents. Only those five reserved keys
are claimed raw; they are left untouched when a descendant holds focus, and
modified chords are left to application shortcuts. A link-role Pressable
activates with Enter but leaves Space available for scrolling.Style.widgetStates now discovers state
requirements recursively through nested and negated context-variant branches
with identity-based cycle protection, so variants like
onDark(BoxStyler().onHovered(...)) and onEnabled(...) are tracked instead
of silently never activating. Branches under un-applied named variants are
deliberately not tracked because they cannot activate until applyVariants
hoists them to the top level.StyleBuilder now
installs its pointer-interaction detector only for the states that detector
actually drives (hovered/pressed). States such as disabled and focused
can only come from an external WidgetStatesController or an ancestor scope,
so styles depending solely on those no longer gain an opaque hit-test target
that swallowed pointer events aimed at widgets beneath them, and no longer
hijack the state scope of descendants that do track hover.onFocusVisible also resolves — and repaints on input
modality changes — outside a Pressable. A WidgetStateStyleOverride forcing
focused now applies it too, matching onFocused.GridBox: Added the public GridTrack, GridBoxSpec, GridBoxStyler, and GridBox API with fixed/fractional tracks, explicit and repeated rows, gaps, row-m
GridTrack, GridBoxSpec, GridBoxStyler, and
GridBox API with fixed/fractional tracks, explicit and repeated rows, gaps,
row-major placement, clipping, and local Breakpoint-based constraint
branches. Equal fractional columns use equalColumns; numeric tracks and
gaps support Mix tokens; compatible geometry participates in implicit style
animation.WrapSpec, WrapStyler, WrapBoxSpec,
WrapBoxStyler, and WrapBox family with flattened fluent Wrap styling,
collision-safe Box/Wrap names, generated constructors and factories, and a
runnable gallery example.Box shadow blur styles: BoxShadowMix now preserves non-default BoxShadow.blurStyle values across construction, conversion, merging, resolution, diagno
BoxShadowMix now preserves non-default
BoxShadow.blurStyle values across construction, conversion, merging,
resolution, diagnostics, equality, and its fluent and factory APIs (#992).Style-state override scope: WidgetStateStyleOverride lets tooling and tests force widget-state variants through normal style resolution, taking preced
WidgetStateStyleOverride lets tooling and
tests force widget-state variants through normal style resolution, taking
precedence over controllers and nested interaction providers without
changing component behavior.CssKeywordLinearTransform: Adds a reusable bounds-aware
GradientTransform for CSS linear-gradient keyword directions, so Tailwind
corner gradients can round-trip through schema tooling without losing visual
parity.BrightnessVariant, BreakpointVariant,
OrientationVariant, DirectionalityVariant, PlatformVariant,
WebVariant, and NotVariant are now public value objects behind their
ContextVariant factories, giving schema and tooling code stable typed data
to inspect instead of parsing keys.Variant.key. Equivalent
named, enum-backed, and built-in context variants still coalesce, while
unrelated variants with the same label retain their own predicates. Dynamic
builders keep their existing build-then-merge behavior and use function
equality instead of a hash string for merge identity.ContextVariant.brightness,
ContextVariant.breakpoint, ContextVariant.orientation,
ContextVariant.directionality, ContextVariant.platform,
ContextVariant.web, and ContextVariant.not now compare by their typed
values instead of identity, so equivalent variants deduplicate and
round-trip predictably.DefaultTextStyleModifierMix
overrides now merge with the ambient DefaultTextStyle instead of replacing
inherited text style fields.tokenFromReferenceValue is now public for schema/tooling code that needs
to identify unresolved token references, including sentinel-backed
DoubleRef values, without importing Mix internals.This release adds context-derived token resolution and richer animation configuration, fixes variant resolution in nested styles and animation interpo
This release adds context-derived token resolution and richer animation configuration, fixes variant resolution in nested styles and animation interpolation edge cases, and hardens the token-reference system while tightening the public API around the internal token registry.
ContextToken: Zero-config token whose value is derived directly from
the build context, so context-dependent values resolve without first
registering a token in a scope (#938).AnimationConfig statics are now factories,
with added spring-curve wrappers for configuring physics-based transitions
(#937).Style nested inside another style's Prop
(a component sub-style) now applies its own context variants — widget states,
brightness, breakpoints. Previously Prop.resolveProp resolved the merged
nested style via resolve(), which skips variants. No-op for nested styles
without variants (#926).Matrix4 interpolation: Tween a transform against the identity matrix
when one endpoint is null, instead of producing a degenerate result (#931).DoubleRef sentinel collisions: Two distinct MixToken<double>
instances whose hashes landed in the same bucket previously aliased to the
same sentinel. The registry now hands out sentinels from a monotonic
counter, so sentinels are unique among registered tokens; a reverse cache
re-issues the same sentinel for the same token.BreakpointToken.resolve no longer masks type errors: the built-in
mobile/tablet/desktop defaults are only used when the scope is
absent or omits the entry. A scope entry of the wrong type now surfaces
the underlying StateError from MixScope.getToken.Prop.value(x).mergeProp( Prop.token(t)).multiply(2) and similar chains now resolve instead of
throwing — _asPropNum rebuilds every source as Prop<num> and merges
in order.Prop.value null safety: the token-ref detection branch no longer
crashes when V is nullable and the supplied value is null.ValueRef.noSuchMethod throws UnsupportedError (was
UnimplementedError). The detailed message is unchanged; only the error
type differs. Any user code that catches the specific class needs to
switch.getReferenceValue no longer silently casts an unsupported token
type — it now throws UnsupportedError naming the token and T. All
concrete MixToken subclasses override call() and never hit this path;
the change only affects custom MixToken authors who relied on the cast.clearTokenRegistry and
getTokenFromValue are no longer re-exported from package:mix/mix.dart
(both are now @internal; tests reach them via package:mix/src/...).
The public DoubleRef(double) constructor was removed — DoubleRef
instances are only ever obtained through MixToken<double>.call().
For an explicit, type-safe handle to a double token, use
Prop.token(token).isAnyTokenRef drops the brittle runtimeType.toString().endsWith(...)
check; a Prop carrying a TokenSource is now the sole class-based
invariant.StyleWidget defaults to IdentityStyle<Spec>, giving widgets a
well-defined no-op style when none is supplied (#921).`ColorRef` directive overrides: Non-deprecated Color methods on ColorRef (e.g. withValues) are now overridden to return a ref carrying a directive, ke…
This release adds finer-grained control over scope inheritance and theming, and restores compatibility with newer Flutter SDKs.
MixScope.inherit: Opt into merging with the nearest ancestor MixScope instead of replacing it, so nested scopes can extend tokens and breakpoints without re-declaring them (#914).ColorRef directive overrides: Non-deprecated Color methods on ColorRef (e.g. withValues) are now overridden to return a ref carrying a directive, keeping color tokens unresolved until rendering (#908).TextDecorationRef so Mix builds against newer Flutter SDKs where TextDecoration is no longer extendable (#913).Legacy utility classes and mutable stylers: All remaining deprecated utility classes and mutable stylers were removed, finishing the transition to the…
This release completes the 2.0 Styler migration by removing the remaining legacy utility surface, and adds new ergonomic shorthands and variant tooling.
TextStyler values down the widget tree via a modifier, matching the pattern used by other default stylers (#905).MixStyler export: MixStyler is now exported from the public API, matching the documentation (#900).This patch release improves day-to-day styling ergonomics and makes looping animations more reliable in edge cases.
This patch release improves day-to-day styling ergonomics and makes looping animations more reliable in edge cases.
BoxStyler(), TextStyler(), IconStyler(), and related stylers are the primary styling surface. All deprecated spec utilities, legacy widget/style entry…
Mix 2.0 is a ground-up rethink of how styling works in Flutter. This release introduces Styler-first APIs with fluent chaining, leverages Dart 3.11+ dot shorthands for concise syntax, modernizes the widget modifier model, and adds full code generation for specs and stylers via mix_annotations / mix_generator.
$ utilities. BoxStyler(), TextStyler(), IconStyler(), and related stylers are the primary styling surface. All deprecated spec utilities, legacy widget/style entry points, and unused enum/color helpers have been removed (#806, #870).WidgetModifierConfig construction instead of older patterns (#775).resolveProp is @internal; use MixOps.resolve where you relied on the previous surface (#833).>=3.11.0, Flutter >=3.41.0.Styled* widget names deprecated in favor of new naming conventions (#619).Style usage (#644).MixWidgetStateModel (#698); MixWidgetStateController deprecated (#586).BoxStyler().color(Colors.blue).size(100, 100).paddingAll(16).applyVariants() for applying NamedVariant sets in one place (#801).Style.of() and Style.maybeOf() for reading resolved styles from the widget tree (#784).Stack / FlexBox (and related) for concise composition; Stack / StackBox restructured for the 2.0 model (#779).DefaultStyledText and DefaultStyledIcon typedefs for consistent defaults (#767).MixableSpec / MixableStyler generation, MixableField.setterType, and Style-class extension support in mix_generator (#835, #846, #845).SpecUtility, Style, and Attributes unified as compatible values (#643).StyleSpecBuilder build path simplified (#825).@immutable; clearer equality behavior (#821).BaseStyle utility class introduced for improved styling architecture (#659).MixBuilder to SpecBuilder (#651).VariantStyle merge and widget state handling in StyleBuilder (#774, #765).copyWith parameters; lerp respects nullability (including generator fixes) (#848, #849).chain getter on StackStyler; AnimationStyleMixin on FlexBoxStyler and StackBoxStyler (#818, #819).Mixable now extends EqualityMixin instead of StyleElement (#648).Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
REFACTOR: Fix deprecations and modernize codebase (#647).
MixWidgetStateController (#586).REFACTOR: Fix deprecations and modernize codebase (#647).
MixWidgetStateController (#586).REFACTOR: Rename MixableProperty to MixableType
MixableProperty to MixableType (#574)FEAT: Accordion interaction based on open variable (#546).
REFACTOR: Solve dcm lint issues (#519).
SpecConfiguration (#483).TokenResolver (#537).SpecConfiguration (#483).TokenResolver (#537).mix - v1.5.2mix - v1.5.1Packages with breaking changes:
Packages with breaking changes:
Packages with other changes:
Packages with dependency updates only:
Packages listed below depend on other packages in this workspace that have had changes. Their versions have been incremented to bump the minimum dependency versions of the packages they depend upon in this project.
remix - v0.0.2-alpha.2Packages with breaking changes:
Packages with breaking changes:
Packages with other changes:
FIX: Update OnBrightnessVariant to use MediaQuery instead of Theme (#471).
MediaQuery instead of Theme (#471).FIX(docs): fix fn level docs for Style::applyVariants (#460).
SingleChildScrollView widget modifier (#427).Packages with breaking changes:
Packages with breaking changes:
Packages with other changes:
Packages with dependency updates only:
Packages listed below depend on other packages in this workspace that have had changes. Their versions have been incremented to bump the minimum dependency versions of the packages they depend upon in this project.
remix - v0.0.2+4Packages with breaking changes:
Packages with breaking changes:
Packages with other changes:
Packages with dependency updates only:
Packages listed below depend on other packages in this workspace that have had changes. Their versions have been incremented to bump the minimum dependency versions of the packages they depend upon in this project.
remix - v0.0.2+3Packages with breaking changes:
Packages with breaking changes:
Packages with other changes:
Packages with dependency updates only:
Packages listed below depend on other packages in this workspace that have had changes. Their versions have been incremented to bump the minimum dependency versions of the packages they depend upon in this project.
remix - v0.0.2+2Packages with breaking changes:
Packages with breaking changes:
Packages with other changes:
FIX: Added missing widget state utilities (#411).
FEAT: Code generation for Widget Modifiers (#396).
REFACTOR: use timer instead of future (#374).
FIX: Exception when there is no children on flex (#345).
Improved merge behavior between ShapeDecoration and BoxDecoration
Fixed some specs not respecting nested animated.
Mix now uses mix_generator for Spec and Dto generation.
Revamped Mix API for improved functionality and developer experience.
Visit our documentation site for more information https://www.fluttermix.com
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
InheritedAttribute - Custom Mix attributes #94 by @pbissonho.
Your coding agent can read these notes before it upgrades. Set up the MCP server →