From cd077d26fe8cd762800d3930ed5e8002117d49fe Mon Sep 17 00:00:00 2001 From: Ben Hagen Date: Thu, 21 Jun 2018 17:03:16 +0200 Subject: [PATCH] Fadeout placeholder --- lib/src/chewie_player.dart | 3 +- lib/src/fadeout_placeholder.dart | 53 +++++++++++++++++++++++++++++++ lib/src/player_with_controls.dart | 9 +++++- 3 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 lib/src/fadeout_placeholder.dart diff --git a/lib/src/chewie_player.dart b/lib/src/chewie_player.dart index f9a5296ea..64e76e94b 100644 --- a/lib/src/chewie_player.dart +++ b/lib/src/chewie_player.dart @@ -54,7 +54,7 @@ class Chewie extends StatefulWidget { this.aspectRatio, this.autoInitialize = false, this.autoPlay = false, - this.startAt, + this.startAt = const Duration(), this.looping = false, this.cupertinoProgressColors, this.materialProgressColors, @@ -84,6 +84,7 @@ class _ChewiePlayerState extends State { placeholder: widget.placeholder, autoPlay: widget.autoPlay, showControls: widget.showControls, + startAt: widget.startAt, ); } diff --git a/lib/src/fadeout_placeholder.dart b/lib/src/fadeout_placeholder.dart new file mode 100644 index 000000000..74dff5aff --- /dev/null +++ b/lib/src/fadeout_placeholder.dart @@ -0,0 +1,53 @@ +import 'package:flutter/material.dart'; +import 'package:video_player/video_player.dart'; + +class fadeoutPlaceholder extends StatefulWidget { + final VideoPlayerController controller; + final Widget placeholder; + final Duration fadeAfter; + + fadeoutPlaceholder({this.controller, this.placeholder, this.fadeAfter}); + + @override + _fadeoutPlaceholderState createState() => _fadeoutPlaceholderState(); +} + +class _fadeoutPlaceholderState extends State { + VoidCallback listener; + + VideoPlayerController get controller => widget.controller; + + _fadeoutPlaceholderState() { + listener = () { + setState(() {}); + }; + } + + @override + void didUpdateWidget(fadeoutPlaceholder oldWidget) { + if (oldWidget.controller != controller) { + controller.addListener(listener); + } + super.didUpdateWidget(oldWidget); + } + + @override + void initState() { + super.initState(); + controller.addListener(listener); + } + + @override + void deactivate() { + controller.removeListener(listener); + super.deactivate(); + } + + @override + Widget build(BuildContext context) { + return AnimatedOpacity( + opacity: controller.value.position > widget.fadeAfter ? 0.0 : 1.0, + duration: Duration(milliseconds: 200), + child: widget.placeholder ?? Container()); + } +} diff --git a/lib/src/player_with_controls.dart b/lib/src/player_with_controls.dart index 74217b941..c784c0809 100644 --- a/lib/src/player_with_controls.dart +++ b/lib/src/player_with_controls.dart @@ -3,6 +3,7 @@ import 'dart:ui'; import 'package:chewie/src/chewie_progress_colors.dart'; import 'package:chewie/src/cupertino_controls.dart'; +import 'package:chewie/src/fadeout_placeholder.dart'; import 'package:chewie/src/material_controls.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; @@ -18,6 +19,7 @@ class PlayerWithControls extends StatefulWidget { final double aspectRatio; final bool autoPlay; final bool showControls; + final Duration startAt; PlayerWithControls({ Key key, @@ -30,6 +32,7 @@ class PlayerWithControls extends StatefulWidget { this.materialProgressColors, this.placeholder, this.autoPlay, + this.startAt, }) : super(key: key); @override @@ -62,7 +65,6 @@ class _VideoPlayerWithControlsState extends State { return new Container( child: new Stack( children: [ - widget.placeholder ?? new Container(), new Center( child: new Hero( tag: controller, @@ -76,6 +78,11 @@ class _VideoPlayerWithControlsState extends State { ), ), ), + fadeoutPlaceholder( + controller: controller, + placeholder: widget.placeholder, + fadeAfter: widget.startAt, + ), _buildControls(context, controller), ], ),