From 6d2abbaf5ecb6658407399aa20f9695feda99319 Mon Sep 17 00:00:00 2001 From: Victor Springer Date: Tue, 9 Sep 2025 10:27:08 +0200 Subject: [PATCH 1/2] fix(web): keep playback when entering/exiting fullscreen on web --- CHANGELOG.md | 4 +++- lib/src/chewie_player.dart | 49 +++++++++++++++++++++++++++++++------- 2 files changed, 43 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 73875e262..d57345ff6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## [Unreleased] +* 🛠️ Fix web fullscreen playback on enter/exit: preserve play/pause state and resume stream on web. Avoids stall requiring manual pause/play. + ## [1.12.1] * 🛠️ [#920](https://github.com/fluttercommunity/chewie/pull/920): Fix zoomAndPan not having an effect. Thanks [abalmagd](https://github.com/abalmagd). @@ -388,4 +391,3 @@ Initial version of Chewie, the video player with a heart of gold. * Includes Material Player Controls * Includes Cupertino Player Controls * Spike version: Focus on good looking UI. Internal code is sloppy, needs a refactor and tests - diff --git a/lib/src/chewie_player.dart b/lib/src/chewie_player.dart index 6c98a3caf..c20ad476f 100644 --- a/lib/src/chewie_player.dart +++ b/lib/src/chewie_player.dart @@ -39,6 +39,8 @@ class Chewie extends StatefulWidget { class ChewieState extends State { bool _isFullScreen = false; + bool _wasPlayingBeforeFullScreen = false; + bool _resumeAppliedInFullScreen = false; bool get isControllerFullScreen => widget.controller.isFullScreen; late PlayerNotifier notifier; @@ -70,6 +72,9 @@ class ChewieState extends State { Future listener() async { if (isControllerFullScreen && !_isFullScreen) { + _wasPlayingBeforeFullScreen = + widget.controller.videoPlayerController.value.isPlaying; + _resumeAppliedInFullScreen = false; _isFullScreen = isControllerFullScreen; await _pushFullScreenWidget(context); } else if (_isFullScreen) { @@ -133,6 +138,22 @@ class ChewieState extends State { builder: (context, w) => const PlayerWithControls(), ), ); + + if (kIsWeb && !_resumeAppliedInFullScreen) { + _resumeAppliedInFullScreen = true; + WidgetsBinding.instance.addPostFrameCallback((_) async { + if (!mounted) return; + final vpc = widget.controller.videoPlayerController; + await vpc.pause(); + await Future.delayed(const Duration(milliseconds: 10)); + if (_wasPlayingBeforeFullScreen) { + await vpc.play(); + } else { + await vpc.play(); + await vpc.pause(); + } + }); + } if (widget.controller.routePageBuilder == null) { return _defaultRoutePageBuilder( @@ -166,8 +187,11 @@ class ChewieState extends State { rootNavigator: widget.controller.useRootNavigator, ).push(route); + final wasPlaying = + widget.controller.videoPlayerController.value.isPlaying; + if (kIsWeb) { - _reInitializeControllers(); + await _reInitializeControllers(wasPlaying); } _isFullScreen = false; @@ -235,16 +259,23 @@ class ChewieState extends State { } } - ///When viewing full screen on web, returning from full screen causes original video to lose the picture. - ///We re initialise controllers for web only when returning from full screen - void _reInitializeControllers() { + /// When viewing full screen on web, returning from full screen could cause + /// the original video element to lose the picture. We re-initialize the + /// controllers for web only when returning from full screen and preserve + /// the previous play/pause state. + Future _reInitializeControllers(bool wasPlaying) async { final prevPosition = widget.controller.videoPlayerController.value.position; - widget.controller.videoPlayerController.initialize().then((_) async { - widget.controller._initialize(); - widget.controller.videoPlayerController.seekTo(prevPosition); + + await widget.controller.videoPlayerController.initialize(); + widget.controller._initialize(); + await widget.controller.videoPlayerController.seekTo(prevPosition); + + if (wasPlaying) { await widget.controller.videoPlayerController.play(); - widget.controller.videoPlayerController.pause(); - }); + } else { + await widget.controller.videoPlayerController.play(); + await widget.controller.videoPlayerController.pause(); + } } } From 6ceb832a7859a4223b2cf3e921e7fd5ce9f6568d Mon Sep 17 00:00:00 2001 From: Victor Springer Date: Tue, 9 Sep 2025 11:18:12 +0200 Subject: [PATCH 2/2] restore changelog --- CHANGELOG.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d57345ff6..4c2f7fb1f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,3 @@ -## [Unreleased] -* 🛠️ Fix web fullscreen playback on enter/exit: preserve play/pause state and resume stream on web. Avoids stall requiring manual pause/play. - ## [1.12.1] * 🛠️ [#920](https://github.com/fluttercommunity/chewie/pull/920): Fix zoomAndPan not having an effect. Thanks [abalmagd](https://github.com/abalmagd).