chewie_player.dart 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import 'dart:async';
  2. import 'package:chewie/src/chewie_controller.dart';
  3. import 'package:chewie/src/player_with_controls.dart';
  4. import 'package:flutter/material.dart';
  5. import 'package:flutter/services.dart';
  6. import 'package:flutter/widgets.dart';
  7. import 'package:screen/screen.dart';
  8. /// A Video Player with Material and Cupertino skins.
  9. ///
  10. /// `video_player` is pretty low level. Chewie wraps it in a friendly skin to
  11. /// make it easy to use!
  12. class Chewie extends StatefulWidget {
  13. Chewie({
  14. Key key,
  15. this.controller,
  16. }) : assert(controller != null, 'You must provide a chewie controller'),
  17. super(key: key);
  18. /// The [ChewieController]
  19. final ChewieController controller;
  20. @override
  21. ChewieState createState() {
  22. return ChewieState();
  23. }
  24. }
  25. class ChewieState extends State<Chewie> {
  26. bool _isFullScreen = false;
  27. @override
  28. void initState() {
  29. super.initState();
  30. widget.controller.addListener(listener);
  31. }
  32. @override
  33. void dispose() {
  34. widget.controller.removeListener(listener);
  35. super.dispose();
  36. }
  37. void listener() async {
  38. if (widget.controller.isFullScreen && !_isFullScreen) {
  39. _isFullScreen = true;
  40. await _pushFullScreenWidget(context);
  41. } else if (_isFullScreen) {
  42. Navigator.of(context).pop();
  43. _isFullScreen = false;
  44. }
  45. }
  46. @override
  47. Widget build(BuildContext context) {
  48. return ChewieControllerProvider(
  49. controller: widget.controller,
  50. child: PlayerWithControls(),
  51. );
  52. }
  53. Widget _buildFullScreenVideo(
  54. BuildContext context, Animation<double> animation) {
  55. return Scaffold(
  56. resizeToAvoidBottomPadding: false,
  57. body: Container(
  58. alignment: Alignment.center,
  59. color: Colors.black,
  60. child: ChewieControllerProvider(
  61. controller: widget.controller,
  62. child: PlayerWithControls(),
  63. ),
  64. ),
  65. );
  66. }
  67. Widget _fullScreenRoutePageBuilder(
  68. BuildContext context,
  69. Animation<double> animation,
  70. Animation<double> secondaryAnimation,
  71. ) {
  72. return AnimatedBuilder(
  73. animation: animation,
  74. builder: (BuildContext context, Widget child) {
  75. return _buildFullScreenVideo(context, animation);
  76. },
  77. );
  78. }
  79. Future<dynamic> _pushFullScreenWidget(BuildContext context) async {
  80. final isAndroid = Theme.of(context).platform == TargetPlatform.android;
  81. final TransitionRoute<Null> route = PageRouteBuilder<Null>(
  82. settings: RouteSettings(isInitialRoute: false),
  83. pageBuilder: _fullScreenRoutePageBuilder,
  84. );
  85. SystemChrome.setEnabledSystemUIOverlays([]);
  86. if (isAndroid) {
  87. SystemChrome.setPreferredOrientations([
  88. DeviceOrientation.landscapeLeft,
  89. DeviceOrientation.landscapeRight,
  90. ]);
  91. }
  92. if (!widget.controller.allowedScreenSleep) {
  93. Screen.keepOn(true);
  94. }
  95. await Navigator.of(context).push(route);
  96. bool isKeptOn = await Screen.isKeptOn;
  97. if (isKeptOn) {
  98. Screen.keepOn(false);
  99. }
  100. SystemChrome.setEnabledSystemUIOverlays(SystemUiOverlay.values);
  101. SystemChrome.setPreferredOrientations([
  102. DeviceOrientation.portraitUp,
  103. DeviceOrientation.portraitDown,
  104. DeviceOrientation.landscapeLeft,
  105. DeviceOrientation.landscapeRight,
  106. ]);
  107. }
  108. }