5.0.0
Aug 24, 2026
The version requires Flutter 3.47.0 or higher. Offers support for SDK decoupled Material and Cupertino libraries.
BREAKING
-
This version requires Flutter 3.47.0 or higher
-
It also opts in on Dart 3.13.0 language features and lints.
-
This release brings full support for the standalone
material_uiandcupertino_uipackages. -
Per Flutter's official recommendation the package is released as a major breaking release, but contains no breaking APIs or any new APIs. Produced
ColorSchemeresults are same as before too, with one intentional bug fix exception, see thesurfaceTintTonefix below. -
FIX-BREAKING: The
FlexTones.surfaceTintTonetone mapping is now actually applied to the producedColorScheme.surfaceTinton thetonesbased generation path. It was always intended to be, but the produced scheme previously always assigned the produced primary color toColorScheme.surfaceTint, silently ignoring the tone mapping. This bug fix changes producedColorScheme.surfaceTintresults for the built-in configurationsFlexTones.ultraContrast,FlexTones.candyPopandFlexTones.chroma, whose customsurfaceTintTone(30 in light mode, 95 in dark mode) differs from their primary tone, as well as for customFlexToneswheresurfaceTintTonediffers fromprimaryTone. The built-insvivid,vividSurfaces,vividBackground,highContrastandjollydefinesurfaceTintTone30 in light mode where their primary tone is also 30, so their produced results do not change. ThesurfaceTintoverride parameter inSeedColorScheme.fromSeedsworks as before. The MCUvariantbased path is unchanged and keepssurfaceTintequal toprimary, matching Flutter'sColorScheme.fromSeed, which usesMaterialDynamicColors.primaryand notMaterialDynamicColors.surfaceTintfor the producedsurfaceTintcolor. This is intentional Flutter parity: the two MCU colors differ whencontrastLevelis not 0 and for the monochrome variant; a code comment now documents this so it is not mistaken for a bug. Usage of thesurfaceTintTonefeature is likely extremely rare, so consumer impact of its fix should be very low, and the new result is the originally intended one.
FIX
FlexTones: theuseCam16property was missing fromcopyWith,operator ==,hashCodeanddebugFillProperties. AnycopyWithcall silently resetuseCam16to its default true, including the internal copyWith-based modifierexpressiveOnContainerthatSeedColorScheme.fromSeedsapplies. This did not change any produced colors, sinceCam16.fromIntandHct.fromIntreturn the same hue and chroma for the same input color, which is also why the omission went unnoticed. Equality however wrongly reported twoFlexTonesconfigs differing only inuseCam16as equal. All four are fixed anddebugFillPropertiesalso gained the previously missingonErrorToneentry.
CHANGE DOCS
The changes below are only documentation and agent changes. No code behavior was changed.
- Reviewed and corrected the informational
FlexSchemeVariantUI stringsdescriptionandconfigDetailsagainst the actual scheme generation code. As documented, these strings may change in any release and this is not a breaking change. No generated colors are affected.expressive: config details tertiary palette uses Chroma 32 (not 24) and hue rotation range 15-120 degrees (not 20-120).soft,vivid,highContrastandoneHue: config details neutral palette uses Chroma 6 (not 4). The value 4 was a leftover from before FSS 2.0.0, when the Material-3 default neutral chroma changed to 6.fidelityandcontent: the descriptions were nearly identical, they now state their actual difference: tertiary palette is the seed color's complement (fidelity) versus an analogous hue (content).vividBackground: description no longer refers to the deprecatedbackgroundcolor swap, it now describes the actual difference tovividSurfaces(white surface in light mode, slightly darker surface in dark mode).- Aligned hue rotation phrasing: variants that also rotate a provided key color's hue (
vibrant,expressive) now read "Hue from primary or key rotated x-y degrees", while variants that use a provided key hue as-is keep the "Hue primary rotated 60 degrees or key" form.
- Fixed stale doc comments that no longer matched the code:
FlexSchemeVariant.vividSurfaces: neutral chroma is 5 and neutralVariant 10, not 8 and 16.FlexSchemeVariant.candyPopandFlexSchemeVariant.chroma: removed references to the removedbackgroundcolor and corrected surface tones (chroma uses light surface tone 99 and dark 4).FlexTones.dark: default neutral chroma limits are 6 and 8, not 4 and 8.FlexTones.candyPop: dark mode surface tone is 6, not 5.FlexTones.chroma: light mode surface tone is 99 (not 98) and dark mode 4 (not 6).
- Codebase-wide documentation review, verified doc comment claims against the actual code and fixed stale information and typos. No code behavior was changed. Highlights:
FlexPaletteType.extendedhas 30 tones; docs variously claimed 24, 25, 26 and 27, and omitted the FSS extra tones 65, 75 and 84 from listings. Also corrected which extended tones are M3 spec additions versus FSS extras (2 and 97 are FSS extras).- Removed the stale
FlexPaletteTypenarrative about thecommontype limiting chroma to max 40 for tones >= 90. That clamp was removed in FSS 2.0.0; the palette types now differ only in included tones. FlexTonesfield docs:secondaryMinChromaandtertiaryMinChromaeffective fallbacks are 0 (docs claimed 16 and 24);neutralChromaconstructor default is 6 (doc claimed 4);onSecondaryFixedTonemaps toonSecondaryFixed(doc saidsecondaryFixed);onSurfacesUseBWdoc no longer claims it affects main on-colors.- Documented two known code quirks instead of changing behavior:
FlexTones.copyWithdoes not includeuseCam16(a copy always resets it to true) and producedColorScheme.surfaceTintis always assignedprimary, soFlexTones.surfaceTintToneis currently not applied. Both are candidates for actual code fixes in a future release. FlexCorePalettedocs: six palettes (not five), error palette defaults to hue 25 / chroma 84; code sample now usesvalue32bitinstead of deprecatedColor.value; "matching Flutter SDK" chroma claims qualified as pre Flutter 3.22 behavior.- MCU fork (comments only, all divergences from upstream text are listed in the mcu-fork-sync skill reference): corrected the stale
useExpressiveOnContainerColorsdoc block (defaults to true since FSS 4.0.0 and only switches the light mode on-container tone, not the contrast curve), wrong color names onoutline,onBackgroundandsecondarydocs, a duplicatedCam16class doc, inverted L*/Y linearity claims, restored two "nonlinearity" comments corrupted by line reflow, added the missing Google license header tokey_color.dart, removed a misleading "automatically generated" banner from the heavily customizedscheme.dart, removed dead commented-out imports, and fixed assorted upstream typos. - Example app: updated stale UI text and comments that said expressive on-container colors are "not yet used by Flutter" (Flutter 3.44+ uses them, with no opt-out; FSS keeps the opt-out). Corrected "only depends on the SDK" claims to
material_ui, wrong default value comments incustom_tones.dart, and assorted typos. - Repo docs and CI comments:
dart format --fixno longer exists in Dart 3.13, commands updated inAGENTS.mdand skills;CONTRIBUTING.mdnow saysmasterbranch; corrected stale workflow header comments (test.ymlis the active CI,validate.yamlis disabled and used a removedflutter formatcommand; web build no longer references a renderer flag).
- Reviewed the README against the code and updated stale information, typos and grammar. Screenshots are unchanged; they were made with earlier demo app versions but remain valid for documentation purposes. Highlights:
- Corrected the predefined
FlexTonesconfiguration count to twelve (said eleven) and the pre-FSS 2.0.0 default value comments in the customFlexTonescode sample (primaryMinChroma,secondaryChromaandtertiaryChromadefault to null, not 36/16/24). - Removed the stale description of the
FlexPaletteType.commonhigh-tone chroma clamp, deleted in FSS 2.0.0; the palette types now differ only in included tones. - Rewrote the resolved Flutter/MCU speculation in the expressive on-container section: Flutter stable 3.44 and later use MCU 0.13.0 with expressive on-containers as the only option, FSS keeps the opt-out. Also clarified that the FSS fork's flag only switches the light on-container tone 30/10, the contrast curve always follows the newer spec.
- Fixed a broken code sample (
Colors(0xFF555555)→Color(0xFF555555)), wrong sample comments (chroma variant labeled vibrant), and replaced a misleading example that chainedonMainsUseBW().expressiveOnContainer(), where the second modifier was a no-op, with a working example plus a note about modifier order. - Fixed wrong symbol names (
FlexTones.extended/FlexTones.common→FlexPaletteType.*),tonalSport→tonalSpot,FlexSeedSeed scheme→FlexSeedScheme, "FFS" → FSS, repeated "from a seeds", "none surface" → non-surface, and assorted grammar issues. - Added a "Version 5.0.0" note (Flutter 3.47/Dart 3.13 requirement,
material_ui/cupertino_uisupport, thesurfaceTintTonefix), a headline bullet forrespectMonochromeSeed, and a new "Color Channel Getters" section documenting the exportedvalue32bit/alpha8bit/red8bit/green8bit/blue8bitextensions. - The Example Application section heading now links to the v5 demo.
- Corrected the predefined
- Agent/skills config: added a new
releaseskill (pub.dev publish flow, GitHub release triggered web demo deploy, downstream coordination), added a "Verify claims against code" section with known stale-info traps and theFlexSchemeVariantstring phrasing conventions to thecode-documentationskill, and logged deliberate MCU comment divergences in themcu-fork-syncskill reference. Also documented in thepackage-developmentskill thatanalysis_options.yamlis the versioned RydMike linter preferences file publicly shared as a gist, so rule changes to it orall_lint_rules.yamlget a CHANGELOG note and a reminder to update the gist.
TESTS
- Added full-scheme golden locks for
FlexTones.candyPopandFlexTones.chroma, light and dark (FCS7.028, FCS7.029). Together with the existingultraContrastgoldens, all three tone mappings whose produced results changed with thesurfaceTintTonefix are now locked against unintended changes. - Added a test locking the legacy
useExpressiveOnContainerColors: falseon-container colors on the MCU variant path (FCS7.030). Coverage of those legacy branches was lost when other tests moved to the new expressive default. - Added a no-op test for all six
FlexTonesmodifiers called with a false flag (FTO1.15). - Improved MCU fork test coverage and removed 14
coverage:ignoremarkers by adding tests for previously untested branches. These are extra coverage tests not done by MCU upstream. They will allow us to better verify our forked MCU version and detect changes made to MCU upstream in the future:DynamicColor.getTone: background color landing in the awkward tone 50..60 zone,ToneDeltaPairwithstayTogetherin both light and dark mode, all dual background fallback branches, and theforegroundTonenegligible-difference edge case.TemperatureCache:analogouswith more divisions than hue steps and with count larger than divisions, plus cachedcomplementandinputRelativeTemperaturecalls.Score.scorefallback color when all input colors are filtered out.QuantizerWsmeansempty cluster reset when a starting cluster captures no points.- Covered the last IDE-reported coverage misses: the
identicalequality short circuits inCorePaletteandCorePalettes(self comparison tests) and the awkward-zone adjustment to tone 60 inDynamicColor.getTone, used when tone 49 cannot reach the required contrast against a dark background. - The package now has 100% line coverage with only 8 remaining ignore markers, all on verified dead code: compile-time disabled debug logging in
QuantizerWsmeans, negative modulo guards inMathUtilsthat Dart's%operator can never produce, index guards inTemperatureCache.analogousthat its callers can never trigger, and one unreachable defensive padding line.
- Added regression tests for the
FlexTonesuseCam16fix: equality of configs differing only inuseCam16(FTO1.02c) andcopyWith/modifier preservation ofuseCam16(FTO1.09d). - Updated the
FlexTonestoString golden for the addedonErrorToneanduseCam16diagnostics properties. - Corrected the expected configurations in FTO1.017/FTO1.018: they omitted
useCam16: falseforFlexTones.material, which the previous incomplete equality operator could not detect. - Update tests to no longer use
useExpressiveOnContainerColors: falsefor all MCUDynamicSchemeVariants. This is no longer needed as the default is nowtruein Flutter stable 3.44.0 and later. The option to not use expressive on container colors is still available and can be used by settinguseExpressiveOnContainerColorstofalsewhen callingSeedColorScheme.fromSeeds. However, Flutter'sColorScheme.fromSeeddoes not use expressive on container colors anymore, nor does it offer it as an option. WithFlexSeedSchemeit is still available and can be used as before. TheSeedColorScheme.fromSeedsparameteruseExpressiveOnContainerColorsalready defaulted totrueinstead offalsein FSS version 4.0.0, and started using it as default before Flutter switched to it. You can still use the legacy option if you need it.
CHORE
- Bump all dependencies.
- Publishing: resolved both
dart pub publish --dry-runwarnings and reduced the published package archive from 13 MB to about 0.5 MB.- Untracked the git-ignored, Flutter tool generated example platform files (
generated_plugin_registrant.*,generated_plugins.cmakeandGeneratedPluginRegistrant.swiftfor Windows, Linux and macOS). They are regenerated byflutter pub getand builds, and current Flutter project templates git-ignore them. They are no longer part of the published package either. - Added a root
.pubignore. It restates the publishing-relevant.gitignorerules (a.pubignorereplaces the.gitignorein the same directory for publishing decisions) and additionally excludes internal repository content from the published archive:AGENTS.md,docs/,scripts/, and the README image folderdoc_assets/. The README references its images via absolute GitHub URLs, so pub.dev does not need them in the archive. Excludingdocs/also resolves the pub layout warning about a plural top-level docs directory. Theexample/screenshots/folder is intentionally still published: its files are declared in the pubspecscreenshots:section and the pub.dev server rejects the upload if they are missing from the archive, a check the local dry run does not perform.
- Untracked the git-ignored, Flutter tool generated example platform files (
- CI: bumped
codecov/codecov-actionfrom the end-of-life v3 to v5 in all three workflows and renamed itsfile:input tofiles:per the v4+ API. The-dev.1release will serve as a live test of the deploy workflow. - Verified included MCU fork to be at parity with MCU 0.13.1. It was stated to be at 0.13.0 parity before this release. Flutter 3.47 just started using MCU 0.13.0. A check revealed that MCU 0.13.1 is a small internal change, that we also already had in FSS version 4.0.0, it was added before it was published in MCU.
- The new
Cam16hue helper was already in FSS version 4.0.0; MCU 0.13.1 published that commit. - This release is only a doc update about Scheme migration URL + declare fork at 0.13.1 (Flutter 3.47 still on 0.13.0).
- No user-facing ColorScheme / HCT change.
- The new
- Example app's macOS and iOS builds migrated from CocoaPods to Swift Package Manager.
- Code style: Changed from RydMike lints 2.6.0 to RydMike lints 3.0.0. Big code diffs and changes in the code style.
- Updated to opt in on using min Dart 3.13.0 SDK.
- Old code base was compile time incompatible with Dart 3.13.0, fixed the issues that don't compile with Dart 3.13.0. The issue was this breaking change in Dart 3.13:
- Restriction on final and var in normal function parameters: With primary constructors, using final or var on formal parameters in normal functions becomes a compile-time error.
- They are reserved exclusively for declaring parameters in primary constructors. Note that the lints
avoid_final_parametersandvar_with_no_type_annotationonly work with a language version of Dart 3.12 or lower. - To enforce immutable parameters as a style choice in Dart 3.13 and later, use the
parameter_assignmentslinter rule, which this repo already always enforced. See https://dart.dev/language/primary-constructors
- Old code base was compile time incompatible with Dart 3.13.0, fixed the issues that don't compile with Dart 3.13.0. The issue was this breaking change in Dart 3.13:
- Fixed all new lints that came with Dart 3.13.
- Example app: Fixed Flutter SDK deprecation of
axisAlignmentinListTileRevealandSwitchListTileRevealwidgets. - Example app: Temporary use of
MaterialUiCompatibilityBridge.- Used as temporary fix for MaterialUi compatibility for packages that still use Material from SDK, pre Flutter 3.47.0. It is in the example app used for the not yet updated FlexColorPicker that the example app uses.
- The color picker will be updated next and then this temporary fix will be removed and a 5.0.1 release will be published. It is a bit of a chicken and egg situation. The color picker also uses this package, and we need to publish a version of this package first, then update the picker and then update this package again so its example app can use the new version of the picker and remove the
MaterialUiCompatibilityBridge.