dynamic_app_icon_flutter_plus 2.2.1
dynamic_app_icon_flutter_plus: ^2.2.1 copied to clipboard
Dynamic App Icon for Flutter enables Flutter apps to change their launcher icon at runtime, ideal for branding updates, seasonal themes, and feature-based icon switching.
2.2.1 #
- Android — fixed a regression from 2.2.0 that left both the default and alternate launcher icons enabled simultaneously. The 2.2.0 atomic-swap rework accidentally skipped disabling
MainActivityon manifests without a.defaultactivity-alias, so switching to an alternate icon enabled the new alias without disablingMainActivity— showing duplicate launcher icons (#7).IconSwapper.applyIcon()now always disables the previous default component (MainActivityitself, for legacy manifests) unless it is the target, restoring the pre-2.2.0 single-icon behavior.
2.2.0 #
- Android — fixed a critical non-atomic icon swap that could leave the app fully unlaunchable.
IconSwapper.applyIcon()previously disabled every launcher component before enabling the target one. If the process was killed mid-swap — most likely exactly when the swap is deferred toonTaskRemoved/onDestroyviadeferUntilBackground— the app could end up with zero enabled, exported launcher components: no icon, unlaunchable except through system settings ("App info") followed by a reinstall. The swap now enables the target component first and disables the others after, so there is never a moment with no enabled launcher component, no matter when the process dies. - Android —
MainActivityis no longer disabled during an icon swap when a.defaultactivity-alias is declared. TogglingMainActivityitself (the previous behavior) could break deep links, App Links, and notification-tap handling while an alternate icon was active, and could crash on flavor builds usingapplicationIdSuffix. Declare apackage.MainActivity.defaultactivity-alias to own the launcher entry (see the updated Android Setup instructions and the example app's manifest) andMainActivitywill never be toggled again. Manifests without a.defaultalias keep the old behavior (MainActivityis toggled) — this is a non-breaking, opt-in migration. - Android: Added a self-healing safety net — if an icon swap somehow leaves no launcher component enabled, the default component is automatically re-enabled rather than leaving the app bricked.
- Updated the example app's manifest to use the new
.defaultalias pattern, plus a debug-source-set manifest overlay (example/android/app/src/debug/AndroidManifest.xml) that restoresMainActivity's launcher intent-filter forflutter run/flutter attachcompatibility, since Flutter's tooling launchesMainActivitydirectly and doesn't resolve activity-aliases.
2.1.0 #
- Android: Added an opt-in deferred icon swap to avoid the "kick to home" some OEM launchers (MIUI, EMUI, OneUI, ColorOS) trigger when
setComponentEnabledSettingruns while the app is foregrounded.setAlternateIconNamegains adeferUntilBackgroundflag (defaults tofalse). Whenfalse, the icon swaps immediately as before — this release is a drop-in upgrade with no behavior change unless you opt in.- When
deferUntilBackground: true, the swap is queued and applied once the app is backgrounded. The change is performed by a smallDynamicAppIconServiceononTaskRemoved/onDestroy(swipe-to-close), and recovered on next launch if the process was killed before it could run. - New
applyPendingIcon()method — call it from your lifecycle handler onAppLifecycleState.pausedso a deferred swap applies the moment the user leaves the app (e.g. presses Home) instead of waiting for the task to be removed. No-op on iOS.
- iOS: Behavior unchanged — icon swaps remain synchronous;
deferUntilBackgroundandapplyPendingIcon()are no-ops. - Updated the example app with a toggle to demonstrate both the immediate and deferred swap strategies.
2.0.0 #
- BREAKING: Migrated the Android plugin to Flutter's built-in Kotlin support and raised the minimum Flutter version to
3.44.0.- The plugin no longer applies the Kotlin Gradle Plugin (
kotlin-android), which would otherwise break builds on Android Gradle Plugin (AGP) 9.0+. See the migration guide. - Replaced the deprecated
kotlinOptionsblock with thekotlin { compilerOptions { jvmTarget } }DSL. - Bumped the Android toolchain to AGP
9.0.1, Kotlin2.3.20, and Java17.
- The plugin no longer applies the Kotlin Gradle Plugin (
- Updated the example app to built-in Kotlin and bumped Gradle (
9.1.0), AGP (9.0.1), and Kotlin (2.3.20) to clear Flutter 3.44 deprecation warnings.
1.0.1 #
- Fixed Swift Package Manager (SPM) support that was not detected by Flutter in 1.0.0
- Moved
Package.swiftto the Flutter-requiredios/dynamic_app_icon_flutter_plus/path - Moved Swift sources and
PrivacyInfo.xcprivacyinto the SPMSources/layout (shared with CocoaPods) - Declared the
FlutterFrameworkSPM dependency required by Flutter 3.44+
- Moved
- CocoaPods support retained for full backwards compatibility
1.0.0 #
- Added Swift Package Manager (SPM) support for iOS — resolves Flutter SPM compatibility warning
- CocoaPods support retained for full backwards compatibility
0.0.8 #
- Readme
0.0.7 #
- Package fix
0.0.6 #
- Initial Setup
0.0.5 #
- Initial Setup
0.0.4 #
- Initial Setup
0.0.3 #
- Initial Setup
0.0.1 #
- Initial release of dynamic_app_icon_flutter
- Android Support: Dynamic icon changing using activity aliases
- Automatic discovery of available icons from AndroidManifest.xml
- Support for unlimited number of alternate icons
- Flexible icon naming (no hardcoded names)
- Uses main activity as default icon launcher
- iOS Support: Dynamic icon changing using alternate app icons
- Support for iOS 10.3+ alternate icons
- Get available icons from Info.plist
- Set alternate icons with optional alert suppression
- Core Features:
supportsAlternateIcons- Check if platform supports dynamic iconsgetAlternateIconName()- Get current active icon namegetAvailableIcons()- Get list of all available alternate iconssetAlternateIconName()- Set the app icon dynamically
- Example App: Complete UI demonstration with Material Design 3
- Platform support status indicator
- Current icon display
- Available icons list with selection
- Clean, modern interface suitable for pub.dev