import 'dart:async'; import 'package:chewie/src/chewie_controller.dart'; import 'package:chewie/src/player_with_controls.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; import 'package:screen/screen.dart'; /// A Video Player with Material and Cupertino skins. /// /// `video_player` is pretty low level. Chewie wraps it in a friendly skin to /// make it easy to use! class Chewie extends StatefulWidget { Chewie({ Key key, this.controller, }) : assert(controller != null, 'You must provide a chewie controller'), super(key: key); /// The [ChewieController] final ChewieController controller; @override ChewieState createState() { return ChewieState(); } } class ChewieState extends State { bool _isFullScreen = false; @override void initState() { super.initState(); widget.controller.addListener(listener); } @override void dispose() { widget.controller.removeListener(listener); super.dispose(); } void listener() async { if (widget.controller.isFullScreen && !_isFullScreen) { _isFullScreen = true; await _pushFullScreenWidget(context); } else if (_isFullScreen) { Navigator.of(context).pop(); _isFullScreen = false; } } @override Widget build(BuildContext context) { return ChewieControllerProvider( controller: widget.controller, child: PlayerWithControls(), ); } Widget _buildFullScreenVideo( BuildContext context, Animation animation) { return Scaffold( resizeToAvoidBottomPadding: false, body: Container( alignment: Alignment.center, color: Colors.black, child: ChewieControllerProvider( controller: widget.controller, child: PlayerWithControls(), ), ), ); } Widget _fullScreenRoutePageBuilder( BuildContext context, Animation animation, Animation secondaryAnimation, ) { return AnimatedBuilder( animation: animation, builder: (BuildContext context, Widget child) { return _buildFullScreenVideo(context, animation); }, ); } Future _pushFullScreenWidget(BuildContext context) async { final isAndroid = Theme.of(context).platform == TargetPlatform.android; final TransitionRoute route = PageRouteBuilder( settings: RouteSettings(isInitialRoute: false), pageBuilder: _fullScreenRoutePageBuilder, ); SystemChrome.setEnabledSystemUIOverlays([]); if (isAndroid) { SystemChrome.setPreferredOrientations([ DeviceOrientation.landscapeLeft, DeviceOrientation.landscapeRight, ]); } if (!widget.controller.allowedScreenSleep) { Screen.keepOn(true); } await Navigator.of(context).push(route); bool isKeptOn = await Screen.isKeptOn; if (isKeptOn) { Screen.keepOn(false); } SystemChrome.setEnabledSystemUIOverlays(SystemUiOverlay.values); SystemChrome.setPreferredOrientations([ DeviceOrientation.portraitUp, DeviceOrientation.portraitDown, DeviceOrientation.landscapeLeft, DeviceOrientation.landscapeRight, ]); } }