flutter_adaptive_studio 0.15.0
flutter_adaptive_studio: ^0.15.0 copied to clipboard
Vector-native, theme-aware, mask-correct launcher icons and animated splash screens for Flutter — done the way native tooling does it, per platform.
Changelog #
0.15.0 #
New sync command #
fas sync(ordart run flutter_adaptive_studio sync) adds any options yourflutter_adaptive_studio.yamldoesn't yet mention — as commented placeholders in the right section — without touching your existing lines, values, or formatting. It's the non-destructive way for existing users to pick up newly-added options (unlikeinit --force, which overwrites the whole file). Because every inserted line is a comment, it can never change behaviour or break the YAML; it's also idempotent.
0.14.0 #
Splash — text branding #
- New
branding_text:renders a text wordmark at the bottom of the splash when nobrandingimage is given (withbranding_text_color/_dark, auto-contrasting the background when unset). It's rasterised with a built-in font for the native splash (pre-31 launch background + API 31+ branding slot, per density +-night) and emitted as a crispTextwidget in the Flutter fallback. For a brand typeface, use abrandingSVG/PNG instead.
0.13.0 #
Splash — system bars #
- New: tint the status bar and bottom navigation bar during the splash.
status_bar_color/navigation_bar_colortake a hex value ortransparent(each with a_darkvariant), andstatus_bar_icon_brightness/navigation_bar_icon_brightness(dark|light, +_dark) set the bar icon colour — auto-derived from the bar/background colour when omitted. These setstatusBarColor/navigationBarColor/windowLightStatusBar/windowLightNavigationBaron both the pre-31 launch theme and the API 31+ splash theme (and their-nightvariants). - Docs: branding already renders on the pre-31 launch background (it's the
bottom layer of
launch_background.xml) — now visible on Android 10+ after the 0.12.0-v21fix.
0.12.0 #
Splash (critical pre-31 fix) #
- The pre-31 launch splash now actually shows. A stock Flutter project ships
drawable-v21/launch_background.xml, and on API 21+ (virtually every device) Android resolves@drawable/launch_backgroundto that-v21file — so the generator only writingdrawable/launch_background.xmlwas silently shadowed by the stock white default, and the splash background/logo never appeared. We now write the launch background todrawable/anddrawable-v21/(and overwrite any-nightvariants), so it shows on Android 10 and friends. revertrestores the stocklaunch_background.xmltodrawable/+drawable-v21/(instead of deleting), so theLaunchThemereference can't dangle and break the build.
0.11.0 #
Splash (pre-31 launch background) #
- An animated-only splash no longer leaves the Android < 12 launch screen
logo-less. An
animated_iconcan't run in a pre-31windowBackground, so when no staticsplash.image:is set the generator now falls back to your app logo (icon.adaptive.foreground, else the rootsource:) for the pre-31 launch logo — the launch screen shows your mark instead of a bare colour. Setsplash.image:to control it explicitly.
Note: if your launch screen stays blank/white through a long startup, check that
FasNativeSplash.remove()is called synchronously right afterrunApp()— not inside anaddPostFrameCallback. While the first frame is deferred bypreserve(), that callback never fires, soremove()there never runs and the app is stranded on a blank window.
0.10.0 #
Splash (pre-31 reliability) #
- The pre-31
windowBackgroundsplash logo is now rasterised to per-density PNG/WebP (drawable-*/splash_icon_legacy) instead of being referenced as a VectorDrawable.windowBackgroundis inflated by the platform before AppCompat's vector support is active, so a vector logo silently failed to paint on API 21–23 (Android 5–6) — you'd get the background colour but no logo. A bitmap always renders, so the old-device launch splash is now bulletproof. The crisp vector is still used for the Android 12+SplashScreenslot. - New
splash.image_format: png | webpchooses the encoding for that raster logo (PNG default; WebP is smaller and resolves identically on API 18+). - An
animated_iconwith no staticimage:now logs a warning — an AVD can't be awindowBackgrounddrawable, so add animage:for a resting pre-31 logo. revertnow also removes the per-density legacy splash rasters, WebP mipmaps, and thesrc/mainPlay Store PNG.
0.9.0 #
- Widened the
xmlconstraint to>=6.5.0 <8.0.0so apps can depend on this package even when another dependency pinsxml6.x (e.g.flutter_local_notifications). The runtimeFasNativeSplashuses noxml, so the app is unaffected; the generator dev-resolves toxml7.x. - Docs: call
FasNativeSplash.remove()right afterrunApp(), not inside a post-frame callback —deferFirstFrameprevents that callback from firing, soremove()there would strand the app on the splash.
0.8.0 #
Splash #
-
FasNativeSplashnow ships in the package as a runtime API — import it and callFasNativeSplash.preserve(widgetsBinding: …)/remove()exactly likeflutter_native_splash, instead of copying a generated file:import 'package:flutter_adaptive_studio/flutter_adaptive_studio.dart';The CLI no longer emits
fas_native_splash.dart(it would collide with the imported class).
Packaging (breaking) #
- The package now depends on the Flutter SDK so it can expose the runtime API.
Add it to
dependencies(notdev_dependencies) if you useFasNativeSplash. - The main library
package:flutter_adaptive_studio/flutter_adaptive_studio.dartnow exposes the runtime API (FasNativeSplash). The programmatic generator API moved topackage:flutter_adaptive_studio/generator.dart.
0.7.0 #
Splash #
- New generated drop-in
flutter_adaptive_studio/splash/fas_native_splash.dartwithFasNativeSplash.preserve({required widgetsBinding})/remove()— keeps the native splash on screen through app startup (no white flash before your first screen is ready). Pure Flutter framework (deferFirstFrame/allowFirstFrame): no plugin, no native code, no extra dependencies. The signatures matchflutter_native_splashfor a drop-in migration.
0.6.0 #
Android #
- New
icon.image_formatoption (png|webp): encode the generated launcher icon resources (legacy mipmaps + raster foreground density layers) as lossless WebP to shrink the app. The Play Store marketing icon is always PNG, per Google's requirement. Switching format cleans up the same-name file from the previous format so the two can't shadow each other. - The Play Store icon is now written to
android/app/src/main/(matching flutter_launcher_icons), not theandroid/approot; a copy left in the old location by earlier versions is removed. - Fixed a "Duplicate resources" build failure: a stray
<color name="ic_launcher_background">declared in anothervalues/*.xml(e.g. an Android-Studio-generatedic_launcher_background.xml) is now stripped socolors.xmlis the single source of truth.
0.5.0 #
Docs #
- Documented the short
fascommand across the example config + README and theinitstarter template (thefasalias itself shipped in 0.4.0).
0.4.0 #
CLI #
- Added a short
fasexecutable alias. Afterdart pub global activate flutter_adaptive_studioyou can runfas generate,fas init, etc. instead of typing the full package name.
0.3.0 #
Android #
- New
icon.legacy_paddingoption: set the percent the composed legacy mipmap and Play Store art is inset, independently ofadaptive.safe_zone. When unset, the legacy art keeps following the adaptive safe zone, and a finishedicon.imagekeeps its own framing.
0.2.0 #
- Maintenance release (no functional changes).
0.1.0 #
First public release.
Android #
- Adaptive icons (API 26+) from SVG: foreground, background (colour or image), and monochrome Android 13 themed icon, with the art measured and fit into the adaptive safe zone for correct masking.
- Round icon, legacy mipmaps, and the 512² Play Store PNG.
- Opt-in full-colour light/dark icons via generated
activity-aliaswiring, with an optional per-variant background (themed.background/themed.background_dark) that overrides the adaptive background. - Native Android 12
SplashScreen: your AnimatedVectorDrawable wired verbatim (windowSplashScreenAnimatedIcon+ duration), a pre-31 classic splash, and a theme-followingFasSplashFlutter fallback for older devices. - Splash background image, icon background, bottom branding (200×80dp slot), gravity, fullscreen, and screen-orientation lock — all with dark variants.
iOS #
- Single-size 1024²
AppIcon.appiconset(opaque) with iOS 18 dark and tinted appearance variants and a modernContents.json. - Launch screen: a patched
LaunchScreen.storyboarddriven by aLaunchBackgroundcolour set and aLaunchImageimage set (light/dark). - iOS values fall back to the Android splash / root source, so one config can cover both platforms.
Flavors #
- A single
flavors:map that deep-merges over the base config and writes to each flavor's Android resource overlay (src/<flavor>/res). - A separate iOS
AppIcon-<flavor>set, automatically wired into the flavor's build configurations (resolved from its scheme, falling back to theDebug-<flavor>convention).
CLI #
init,generate(default),doctor,preview, andrevertcommands.initwrites a fully-commented config documenting every option.- Pure-Dart rasterization for all outputs — no system tools or FFI required.