v0.9.1
What's Changed
Major playback, notification, and platform-compatibility improvements across Android, iOS, and Web.
✨ New Features
- Web support rebuilt — migrated from deprecated
dart:htmltopackage:web(HTMLAudioElement); fixed the web runtime crash, added full event forwarding (progress, play status, auto-advance on track end), and resolved local assets throughui_web.assetManagerso bundled audio plays in release builds - Android 12+ compatibility —
PendingIntentflags, foreground service type, andMediaSession/MediaStyle-based notification & lock-screen controls - Android 13+ runtime notification permission — requests
POST_NOTIFICATIONSbefore playback and re-posts the playback card once granted updateInfo— update title, description, and cover while playing without restartingcurrentState— query native playback state from any context- Configurable notification title line and previous/next/stop button visibility
- Support loading covers from the app's data directory on Android
- Use
AVURLAssetwith a User-Agent for stream URLs on iOS
🐛 Bug Fixes
- iOS: fix pause being ineffective, volume not syncing, and notification display; migrate to
UIScenelifecycle - Android: fix notification cover not showing and
stopleaking through release builds - Clear the leftover playback card when the app exits and sync the track index on switch
- Fix cover-load failure stopping playback
- Fix shuffle mode so every track is visited before the sequence repeats
- Guard native events after the Flutter engine detaches
- Request Android audio focus; avoid iOS background audio mixing
- Fix
timeupdateclearing the error state and clampsetVolumearguments - Surface native start errors and clear stale loading state
- Sync iOS playback state with the real
AVPlayerstate
🛠 Engineering & Example
- Migrate package and example to Dart 3
- Modernize Android tooling; drop the unused ExoPlayer dependency; upgrade build chain to compileSdk/targetSdk 36 and Gradle 8.14.5
- Add CI workflows and pub publish automation
- Refactor the example into a layered controller-and-screen structure
- Use a reliable HTTPS cover in the example
🔗 Issues Closed
#98, #99, #84, #75, #97, #93, #85, #58, #60, #62, #63, #73, #86, #87, #92, #77, #78