@@ -39,6 +39,8 @@ class Chewie extends StatefulWidget {
3939
4040class ChewieState extends State <Chewie > {
4141 bool _isFullScreen = false ;
42+ bool _wasPlayingBeforeFullScreen = false ;
43+ bool _resumeAppliedInFullScreen = false ;
4244
4345 bool get isControllerFullScreen => widget.controller.isFullScreen;
4446 late PlayerNotifier notifier;
@@ -70,6 +72,9 @@ class ChewieState extends State<Chewie> {
7072
7173 Future <void > listener () async {
7274 if (isControllerFullScreen && ! _isFullScreen) {
75+ _wasPlayingBeforeFullScreen =
76+ widget.controller.videoPlayerController.value.isPlaying;
77+ _resumeAppliedInFullScreen = false ;
7378 _isFullScreen = isControllerFullScreen;
7479 await _pushFullScreenWidget (context);
7580 } else if (_isFullScreen) {
@@ -133,6 +138,22 @@ class ChewieState extends State<Chewie> {
133138 builder: (context, w) => const PlayerWithControls (),
134139 ),
135140 );
141+
142+ if (kIsWeb && ! _resumeAppliedInFullScreen) {
143+ _resumeAppliedInFullScreen = true ;
144+ WidgetsBinding .instance.addPostFrameCallback ((_) async {
145+ if (! mounted) return ;
146+ final vpc = widget.controller.videoPlayerController;
147+ await vpc.pause ();
148+ await Future <void >.delayed (const Duration (milliseconds: 10 ));
149+ if (_wasPlayingBeforeFullScreen) {
150+ await vpc.play ();
151+ } else {
152+ await vpc.play ();
153+ await vpc.pause ();
154+ }
155+ });
156+ }
136157
137158 if (widget.controller.routePageBuilder == null ) {
138159 return _defaultRoutePageBuilder (
@@ -166,8 +187,11 @@ class ChewieState extends State<Chewie> {
166187 rootNavigator: widget.controller.useRootNavigator,
167188 ).push (route);
168189
190+ final wasPlaying =
191+ widget.controller.videoPlayerController.value.isPlaying;
192+
169193 if (kIsWeb) {
170- _reInitializeControllers ();
194+ await _reInitializeControllers (wasPlaying );
171195 }
172196
173197 _isFullScreen = false ;
@@ -235,16 +259,23 @@ class ChewieState extends State<Chewie> {
235259 }
236260 }
237261
238- ///When viewing full screen on web, returning from full screen causes original video to lose the picture.
239- ///We re initialise controllers for web only when returning from full screen
240- void _reInitializeControllers () {
262+ /// When viewing full screen on web, returning from full screen could cause
263+ /// the original video element to lose the picture. We re-initialize the
264+ /// controllers for web only when returning from full screen and preserve
265+ /// the previous play/pause state.
266+ Future <void > _reInitializeControllers (bool wasPlaying) async {
241267 final prevPosition = widget.controller.videoPlayerController.value.position;
242- widget.controller.videoPlayerController.initialize ().then ((_) async {
243- widget.controller._initialize ();
244- widget.controller.videoPlayerController.seekTo (prevPosition);
268+
269+ await widget.controller.videoPlayerController.initialize ();
270+ widget.controller._initialize ();
271+ await widget.controller.videoPlayerController.seekTo (prevPosition);
272+
273+ if (wasPlaying) {
245274 await widget.controller.videoPlayerController.play ();
246- widget.controller.videoPlayerController.pause ();
247- });
275+ } else {
276+ await widget.controller.videoPlayerController.play ();
277+ await widget.controller.videoPlayerController.pause ();
278+ }
248279 }
249280}
250281
0 commit comments