flutter-sdk-changelog
Skill1 starsChanged 42 days agoApache-2.0View on GitHub
Use when you need a Flutter version fact: which Dart SDK ships with a Flutter release, what the correct `environment:` bounds are for a language feature, what replaced a deprecated widget or property, what changed between two Flutter versions, or how to step a legacy Flutter app up to current stable. Every version number here is generated from Google's official release index and the flutter/flutter stable source tree, never from model memory.
1 other project uses a version of this.
Adopted by
Most recently taken up by
- RandalSchwartz/dart-sdk-skillstheir own version, first seen Aug 22, 2026
Other versions1 project uses a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 1
- RandalSchwartz/dart-sdk-skills★ 34same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository18 other files it gives its agents.
- agent-repo-handoff-loopSkill
- device-screen-verificationSkill
- flutter-android-build-systemSkill
- flutter-design-anti-patternsSkill
- flutter-ios-build-systemSkill
- flutter-isar-clean-arch-setupSkill
- flutter-isar-testingSkill
- flutter-lessons-patternsSkill
- flutter-patternsSkill
- flutter-soul-stewardshipSkill
- github-project-auditSkill
- mcp-bridge-patternsSkill
- repo-front-doorSkill
- skill-ecosystem-syncSkill
- specification-writingSkill
- supabase-fullstackSkill
- translation-fidelitySkill
- what-if-analysisSkill
The file
We split this skill into the rules it gives an agent
5 rules. About 0 are common, 1 is distinctive, and 4 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈1
Distinctive · estimate
This author's own choices. Worth a look.
4
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 49
If the answer is not in either file, verify live before answering:
- Very specific: line 124
Only hand-edit what dart fix leaves behind, then flutter analyze.
- Very specific: line 129
Add the matching flutter: floor from the matrix — never guess it:
- Very specific: line 135
Verify on the machine that will build: flutter --version and dart analyze.
- Very specific: line 146
Read the current bounds from pubspec.yaml and the matrix row for that Flutter minor.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Flutter SDK Version, Deprecation & Migration Reference
Freshness contract — read first. Generated 2026-10-30. Stable at generation time: Flutter
3.47.9(2026-10-29) bundling Dart3.13.7. (Cross-channel note: the Dart gap has been zero since3.47.8(2026-10-23) —3.47.7of 2026-10-08 still bundled Dart3.13.5; the standalone Dart stable channel is3.13.7too, so Flutter and standalone Dart ship the same Dart patch, and the3.47.9patch release kept it.) Regenerate withpython3 scripts/build_flutter_sdk_changelog.py --fetch(~4s; resolves the SDK from$FLUTTER_ROOTorwhich flutter, no hard-coded paths). Drift is detected bypython3 scripts/check_freshness.py. Default mode reports and stays exit-0 — a fresh run ends with a final{"wakeAgent": false}line so a cron wake gate skips the agent, whileDRIFT DETECTEDoutput (no such line) wakes it. Use--strictfor gate semantics — exit 1 on drift or unverifiable network. If the gate reports drift, regenerate before answering any version question. A non-zero exit without--strictmeans the script itself crashed. The gate itself is tamper-tested:python3 scripts/test_gate_tamper.pyseeds five defects (stale header, deleted minor row, wrong Dart floor, wrong first-stable row, emptied deprecation reference) and requires exit 1 under--strictwith the right reason for each, plus green control runs — including the wake-line convention (present when fresh, absent on drift). Network gotcha (fixed 2026-10-24 in all three scripts): this machine's Python 3.13 framework build hasssl.get_default_verify_paths().cafile is None, sourllibfetches failed withCERTIFICATE_VERIFY_FAILEDwhilecurl(which reads/etc/ssl/cert.pem) worked. Every script now builds its TLS context fromcertifiwith a system-bundle fallback — verification is never disabled. If you see that error again, an unpatchedurllibcall is the cause, not an outage, and it is never a reason to regenerate.
Rule 0 — never state a Flutter version from memory
Flutter ships a new stable minor roughly every 3 months, so any version fact held in model weights is stale by
construction. This skill exists because that staleness silently breaks pubspec.yaml bounds and CI.
- Version/Dart mapping → read
references/flutter-to-dart-version-matrix.md(generated). - Deprecated symbol → read
references/widget-deprecations-and-replacements.md(generated, 217 members, Flutter 3.13 → 3.44). - If the answer is not in either file, verify live before answering:
curl -s https://storage.googleapis.com/flutter_infra_release/releases/releases_macos.json | python3 -c "import json,sys; d=json.load(sys.stdin); h=d['current_release']['stable']; r=[x for x in d['releases'] if x['hash']==h][0]; print(r['version'], r['release_date'][:10], r['dart_sdk_version'])" flutter --version # what THIS machine has
🎯 Highest-impact deprecations (verified against the 3.47 stable tree)
These are the ones that actually hit an app being upgraded. Full list in the generated reference.
| Deprecated | Replacement | First stable |
cacheExtent, cacheExtentStyle (all scroll views, viewports, reorderable lists) | scrollCacheExtent | 3.44 |
ReorderableList.onReorder | onReorderItem (it fixes the newIndex off-by-one for the removed item) | 3.44 |
SlideTransition / SizeTransition axisAlignment | alignment (controls both axes) | 3.44 |
TextInput.setStyle | updateStyle | 3.44 |
ImageFilter-carrying filter on render objects | filterConfig | 3.41 |
CupertinoSheetRoute.builder / pageBuilder | scrollableBuilder | 3.41 / 3.35 |
Expansible duration / curve / reverseCurve | animationStyle | 3.41 |
Semantics.focusable, isFocusable | focused (setting it implies focusable) | 3.38 |
findChildIndexCallback (ListView.separated, slivers) | findItemIndexCallback (item indices, not child indices) | 3.38 |
SemanticsService.announce | sendAnnouncement (multi-window safe) | 3.38 |
TickerMode.of / getNotifier | TickerMode.valuesOf / getValuesNotifier | 3.38 |
Radio / RadioListTile / CupertinoRadio groupValue + onChanged | wrap in a RadioGroup ancestor | 3.35 |
CupertinoDynamicColor value/red/green/blue/opacity/withOpacity | component accessors .r/.g/.b/.a, toARGB32(), withValues() | 3.35 |
AppBarTheme.color | backgroundColor | 3.35 |
DropdownButtonFormField.value | initialValue | 3.35 |
Switch / SwitchListTile activeColor | activeThumbColor (+ activeTrackColor) | 3.32 |
ExpansionTileController | ExpansibleController | 3.32 |
Tooltip.height / TooltipThemeData.height | constraints | 3.32 |
Color.withOpacity (dart:ui, not the framework tree) | Color.withValues(alpha: …) — wide-gamut migration, avoids 8-bit precision loss | 3.27 |
MaterialState* family | WidgetState, WidgetStateProperty, WidgetStatesController | 3.22 |
Form.onPopInvoked | onPopInvokedWithResult | 3.24 |
WillPopScope | PopScope(canPop:, onPopInvokedWithResult:) — required for Android predictive back | 3.13 |
textScaleFactor (all widgets) | textScaler (nonlinear text scaling) | 3.13 |
Removed, not deprecated — hard build breaks
FlatButton → TextButton; RaisedButton → ElevatedButton; OutlineButton → OutlinedButton;
TextTheme.headline1…6 / bodyText1/2 / subtitle1/2 → displayLarge…bodyLarge/titleMedium;
ThemeData.accentColor → ColorScheme.secondary; Scaffold.of(context).showSnackBar →
ScaffoldMessenger.of(context).showSnackBar; ThemeData.toggleableActiveColor → per-widget
WidgetStateProperty. Verified absent from the 3.47 tree — these produce compile errors, not warnings.
🔗 Dart feature → required Flutter floor
A Dart language feature needs the Flutter release that bundles that Dart SDK. Derived from the generated matrix:
| Dart feature | sdk: lower bound | Implies Flutter >= |
| Primary constructors | ^3.13.0 | 3.47.0 |
| Private named parameters | ^3.12.0 | 3.44.0 |
Dot shorthands (.blue, crossAxisAlignment: .start) | ^3.10.0 | 3.38.0 |
| Sound flow analysis | ^3.9.0 | 3.35.0 |
Null-aware elements ([?maybe]) | ^3.8.0 | 3.32.0 |
Wildcard variables _ | ^3.7.0 | 3.29.0 |
| Digit separators | ^3.6.0 | 3.27.0 |
Pair this skill with dart-sdk-changelog for the Dart-side feature matrix.
🛠️ Runbooks
1. "What replaced X?" / analyzer reports a deprecation
- Grep the generated reference:
grep -i "<symbol>" references/widget-deprecations-and-replacements.md. - Try the automated migration first — Flutter policy requires a data-driven fix with every framework
deprecation (
docs/contributing/Tree-hygiene.md), so this usually does the whole job:dart fix --dry-run # inspect dart fix --apply # migrate - Only hand-edit what
dart fixleaves behind, thenflutter analyze.
2. Choosing environment: bounds for a package
- Decide the newest Dart language feature the code actually uses (see
dart-sdk-changelog). - Set
sdk: '^<that Dart minor>'. - Add the matching
flutter:floor from the matrix — never guess it:environment: sdk: ^3.12.0 flutter: ">=3.44.0" - Verify on the machine that will build:
flutter --versionanddart analyze.
3. "What's new in Flutter X.Y?"
- Confirm X.Y is a real stable minor in the matrix (Flutter skips numbers: there is no stable 3.30, 3.33, 3.36, 3.40, 3.43 — those are dev/beta cycles only).
- State the bundled Dart SDK and release date from the matrix.
- List the deprecations whose
First stableequals X.Y from the generated reference. - For anything beyond that, read the official release notes rather than guessing:
https://docs.flutter.dev/release/release-notes.
4. Rescuing a legacy Flutter app
- Read the current bounds from
pubspec.yamland the matrix row for that Flutter minor. - Step in stable minors, never in one jump — build and run tests at each stop.
- At each stop:
dart fix --apply, thenflutter analyze, then run the app. - Pre-3.0 (Dart < 2.12) apps must cross sound null safety first — that is a Dart-side migration; use
dart-sdk-changelog's legacy rescue guide before touching widgets. - Material 3 is the default theme since Flutter 3.16; if the app pins
useMaterial3: false, treat the M3 switch as its own change with visual review, not a side effect of the upgrade.
5. Refreshing this skill (do this, do not patch numbers by hand)
cd <this skill directory>
python3 scripts/build_flutter_sdk_changelog.py --fetch # re-extracts the stable tree itself
python3 scripts/check_freshness.py --strict # must print ALL FRESH, exit 0The generator finds the Flutter SDK via $FLUTTER_ROOT, else which flutter, and needs it to be a git
checkout (standard git clone, Homebrew and fvm installs are). Pass --flutter-root PATH otherwise.
Then update the "Freshness contract" block and the highest-impact table if new buckets appeared — the
gate fails if that table disagrees with the generated data, so it cannot silently rot.
Automate it: attach scripts/check_freshness.py to a cron job as a wake gate (the job's script
field) — fresh runs end with {"wakeAgent": false} (agent skipped silently), drift output wakes the
agent with the report. In --strict mode it exits 1 on drift or unverifiable network — use that in
CI. Never wire a bare non-zero-exit gate as a Hermes monitor source: the scheduler reads ANY
non-zero exit as "source failed" (operator alert, no agent wake), so drift would never auto-fix.
📌 Provenance and why this is not an upstream copy
Built after auditing RandalSchwartz/dart-sdk-skills
(MIT) on 2026-08-29. Its Dart half was adopted (see dart/dart-sdk-changelog); its Flutter half was rejected
and rebuilt here because it carried three defects that this design structurally prevents:
| Upstream defect | Root cause | Fix applied here |
| Version matrix ended at "Flutter 3.27 / 3.29 — Late 2024 / 2025", missing 6 stable minors and ~18 months | hand-typed tables, and CI gates that only checked frontmatter, link targets and style ("e.g."/"i.e." bans) — never a version fact | matrices are generated from releases_macos.json + the stable git tree, and a cron freshness wake-gate wakes an agent when the published stable moves ahead of the file |
Flutter 3.27 / 3.29 → Dart 3.7 / 3.8 (both off by one; truth is 3.6.0 and 3.7.0) | mapping written from memory | mapping read from the release index, per release |
Color.withOpacity "deprecated in Flutter 3.22" | recalled, not checked; the wide-gamut phase 1 actually landed in stable 3.27.0 (docs.flutter.dev/release/breaking-changes/wide-gamut-framework) | deprecation versions derive from the @Deprecated marker in the source plus the documented beta→stable rule |
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

