NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #3537 most downloaded on pub.dev
A Flutter widget for playing videos from YouTube, Vimeo, assets, and network sources — fully customizable and easy to integrate.
Last release 6 days ago
02 Oct 2026
Release timing varies
gaps range from 8 days to 2 months
Most releases are documented
notes for 45 of the last 60 stable releases
1 version withdrawn
withdrawn after publishing
1 years old
173 releases · first in 2025
While loading, a custom thumbnail keeps its own proportions instead of a 16/9 box that cropped portrait videos.
🐛 Fixes
The README's standard example now compiles: it passes configuration and callbacks, which OmniVideoPlayer requires.
⬆️ Update documentation
configuration and callbacks, which OmniVideoPlayer requires.One column per month.
The route fullscreen pushes to own pop and the back button can now be named, via PlayerUIVisibilityOptions.fullscreenRouteSettings. A NavigatorObserve
✨ New Features
PlayerUIVisibilityOptions.fullscreenRouteSettings. A NavigatorObserver of the app can then tell that route apart from a page of its own — to leave an overlay of its own open while fullscreen is up, for instance.Sending one player fullscreen released every other player on the page: the fullscreen covers them, so they read as scrolled off-screen. They are now l
🐛 Fixes
Fullscreen is now hoisted above the route stack for a player inside a page too, so an OverlayEntry the app put over it — a tutorial bubble, a banner,
🐛 Fixes
OverlayEntry the app put over it — a tutorial bubble, a banner, a PiP — no longer covers it.Fullscreen on the WebView players (YouTube, Vimeo) tore the webview down and reloaded the video, a regression of 6.0.3.
🐛 Fixes
Fullscreen now paints above any OverlayEntry the app inserted over the route stack, so a player living in one no longer shows its old controls through
🐛 Fixes
OverlayEntry the app inserted over the route stack, so a player living in one no longer shows its old controls through fullscreen.A player placed outside a ModalRoute — in an OverlayEntry above the page, for instance — crashed on build with *Null check operator used on a null val
🐛 Fixes
ModalRoute — in an OverlayEntry above the page, for instance — crashed on build with Null check operator used on a null value.enableZoom works again, and now also on the WebView players (YouTube live, Vimeo) (#85).
🐛 Fixes
enableZoom works again, and now also on the WebView players (YouTube live, Vimeo) (#85).OmniPlaybackController.dispose() now returns Future . Await it when you need the video's resources freed before doing something else, such as opening
⚠️ Breaking changes
OmniPlaybackController.dispose() now returns Future<void>. Await it when you need the video's resources freed before doing something else, such as opening a camera. Custom implementations must change their signature.CustomPlayerWidgets.loadingWidget now defaults to the player's own loader instead of a plain CircularProgressIndicator.🐛 Fixes
replay() rewound the video but never started it again. It now restarts right away, even on a big 4K video.errorPlaceholder.loadingWidget and respects showLoadingWidget. So do the two WebView players and the initial loading state.🎛️ New
isReplaying on the controller: true while the video is restarting. Use it to avoid offering a "tap to restart" on a restart already under way.PlayerUIVisibilityOptions.showSeekingIndicator (default true): hides the seek spinner alone.GlobalPlaybackController is now exported. Call releaseAllResources() on it to give the device's video resources back, before opening a camera for example; the players on screen come back on their own afterwards.🐛 A custom loading widget is no longer letterboxed
🐛 A custom loading widget is no longer letterboxed
loadingWidget was boxed into a guessed 16/9 while the aspect ratio was still unknown, so a full-bleed loader came out the wrong shape on a portrait video. It now fills the player until the real ratio is known; a centred spinner is unaffected.🔊 Several muted players at once
🔊 Several muted players at once
⏱️ "Finished" is now correct, on all four backends
isFinished compares durations instead of whole seconds: a 1.96s video no longer reports finished at 1.0s, nor a sub-second one from position zero. A thumbnail therefore stops covering a still-playing video.onFinished fires once per playback at the real end and re-arms, so it can count loops — fullscreen used to fire it twice.🔈 initialVolume survives
hasExplicitVolume tells the two apart.🐛 Fixes
copyWith dropped videoFile, so .file(...).copyWith(...) always crashed on init.Removed an unused catch stack-trace variable so the package passes pub.dev static analysis cleanly.
🧹 Static analysis
🎛️ YouTube WebView controls — grouped config (BREAKING)
🎛️ YouTube WebView controls — grouped config (BREAKING)
VideoSourceConfiguration.youtube(webView: YoutubeWebViewConfiguration(...)):
forceWebViewOnly (was forceYoutubeWebViewOnly), enableFallback (was enableYoutubeWebViewFallback).useNativeControls (new, default true): use YouTube's native play/pause + double-tap (our bottom bar stays overlaid). Set false for the previous fully-custom controls.onExternalLink: react to in-player links (Watch on YouTube, title, …) — they're always blocked.Migration: move forceYoutubeWebViewOnly/enableYoutubeWebViewFallback into webView:; set useNativeControls: false to keep the old custom controls.
🐛 Bug Fixes — playback reliability (#82, #78)
00:00 or a permanent replay button).🐛 Bug Fixes — fullscreen orientation
🐛 Bug Fixes — fullscreen orientation (#75)
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]).PlayerUIVisibilityOptions.restoreOrientationsAfterFullscreen: set it to your app's orientations (e.g. [DeviceOrientation.portraitUp]) and they are reapplied automatically when the player exits fullscreen.null, which keeps the previous behavior (restore all orientations) — non-breaking.🐛 Bug Fixes — kids/restricted YouTube playback
🐛 Bug Fixes — kids/restricted YouTube playback
androidVr manifest fails (kids/restricted videos), fall back to the default InnerTube clients and keep muxed streams only (~360p), avoiding the HTTP 403 that adaptive video+audio streams return in ExoPlayer for these videos.mp4a audio.androidVr manifest are no longer treated as restricted: they are retried instead of triggering the mux-only fallback, so normal videos are never silently downgraded to 360p on a single network blip.androidVr manifest with the existing Android/iOS stream selection (720p+ on Android).New OmniVideoPlaylist widget with OmniPlaylistController, PlaylistConfiguration, and PlaylistCallbacks.
🎬 Playlist
OmniVideoPlaylist widget with OmniPlaylistController, PlaylistConfiguration, and PlaylistCallbacks.autoAdvance (advance automatically when a video finishes) and loop (wrap around the ends).VideoSourceConfiguration.🎨 Theming (breaking)
VideoPlayerColorScheme.playPauseBackground → controlButtonBackground and playPauseIcon → controlButtonIcon. These colors are shared by the play/pause, replay, loader and skip-indicator buttons, and now the playlist prev/next buttons too. Migration: rename these parameters in your VideoPlayerColorScheme(...) / .copyWith(...) calls.controlButtonBackground/controlButtonIcon), icons (VideoPlayerIconTheme.skipPrevious/skipNext), and accessibility labels (VideoPlayerAccessibilityTheme.previousTrackLabel/nextTrackLabel).Nothing published for this version
Added comprehensive isDisposed guards to all controller setters (volume, duration, playing, etc.) to prevent "ChangeNotifier used after being disposed
✨ Stability & Bug Fixes
isDisposed guards to all controller setters (volume, duration, playing, etc.) to prevent "ChangeNotifier used after being disposed" crashes during global resource cleanup.GlobalVolumeSynchronizer to safely ignore disposed controllers during global volume updates.Added isDisposed check to all controllers to prevent ChangeNotifier errors after disposal.
✨ New Features & Bug Fixes
isDisposed check to all controllers to prevent ChangeNotifier errors after disposal.OmniVideoPlayerView to safely handle controller disposal and listener removal.VisibilityDetector to OmniVideoPlayerInitializer to automatically re-initialize players that were disposed or failed when they become visible again.Hardware Decoder Auto-Recovery:
✨ New Features
OmniPlaybackController instances.NO_MEMORY or CodecException (error 0xfffffff4).releaseAllResources() to GlobalPlaybackController to force-dispose all active players in critical memory situations.Fixed replay race condition on all player types (YouTube, Vimeo, WebM, network).
🛠 Fix
Fixed replay race condition on all player types (YouTube, Vimeo, WebM, network).
replay() now runs sequentially (pause → seekTo(0) → play) instead of in parallel, preventing the video from stalling at position 0 with the wrong button state.Fixed autoMuteOnStart + autoPlay ignored on Vimeo mobile.
play(), mute(), unMute(), and volume setter now use _executeOrQueue so deferred actions are correctly applied once the WebView is ready.$volume) instead of the new value ($value) to the JS player.Feat: New interactive Web volume slider (VolumeSliderControl) with hover support.
✨ New Features
VolumeSliderControl) with hover support.VideoPlayerOverlayTheme to VideoPlayerBackdropTheme.VideoPlayerMenuTheme, menuBorderRadius, volumeSliderThumbShape, and new volume-specific colors in VideoPlayerColorScheme.resolve autoMuteOnStart ignored
🛠 Fix
Fixed playback controls visibility and interaction issues on Web.
🛠 Fix
Added `activeGradient` parameter to VideoPlayerColorScheme into OmniVideoPlayerThemeData
✨ New Features
activeGradient parameter to VideoPlayerColorScheme into OmniVideoPlayerThemeDataFixed an error on onSeekRequest
🛠 Fix
Nothing published for this version
Fixed an error when switching to fullscreen in youtube live video
🛠 Fix
Fixed an error into build for mobile
🛠 Fix
⬆️ Update documentation
⬆️ Update documentation
Added native HTML iframe support for Vimeo on Flutter Web
✨ New Features
Added `httpHeaders` parameter to VideoSourceConfiguration.network()
✨ New Features
httpHeaders parameter to VideoSourceConfiguration.network()
Fixed an issue where YouTube live videos were failing to play.
🛠 Fix
🛠 Fix * Fixed minor bugs
🛠 Fix
Added `autoFullScreenAtStart` parameter to VideoSourceConfiguration.
✨ New Features
autoFullScreenAtStart parameter to VideoSourceConfiguration.
false.Fixed audio-video synchronization issues for YouTube videos.
🛠 Fix
Added `pauseWhenOutOfView` parameter to VideoSourceConfiguration.
✨ New Features
pauseWhenOutOfView parameter to VideoSourceConfiguration.
true (the video will pause when it leaves the view).⬆️ Update documentation
⬆️ Update documentation
Fixed network http player bug with duration
🛠 Fix
Nothing published for this version
Fixed minor bugs on YouTube Webview isFinished
Resolved video/audio desynchronization when using seekTo
seekTo🛠 Fix * Fixed vimeo player bug * See issue: #54
🛠 Fix
Nothing published for this version
⬆️ Updates pub.dev page
⬆️ Updates pub.dev page
Nothing published for this version
Added new enableZoom parameter in PlayerUIVisibilityOptions to allow pinch-to-zoom gestures on the video player (default: false).
✨ New Features
enableZoom parameter in PlayerUIVisibilityOptions to allow pinch-to-zoom gestures on the video player (default: false).Nothing published for this version
Nothing published for this version
🛠 Fix * Fixed some minor bugs
🛠 Fix
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →