Skip to content

Commit b8b967b

Browse files
authored
Merge pull request #927 from victorspringer/fix/web-fullscreen-resume
Fix(web): Keep playback when entering/exiting fullscreen on web
2 parents c094ed8 + 6ceb832 commit b8b967b

File tree

2 files changed

+40
-10
lines changed

2 files changed

+40
-10
lines changed

CHANGELOG.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -388,4 +388,3 @@ Initial version of Chewie, the video player with a heart of gold.
388388
* Includes Material Player Controls
389389
* Includes Cupertino Player Controls
390390
* Spike version: Focus on good looking UI. Internal code is sloppy, needs a refactor and tests
391-

lib/src/chewie_player.dart

Lines changed: 40 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ class Chewie extends StatefulWidget {
3939

4040
class 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

Comments
 (0)