2020-06-19 23:03:26 +00:00
|
|
|
import 'package:chewie/chewie.dart';
|
2020-06-20 23:51:10 +00:00
|
|
|
import 'package:flutter/material.dart';
|
2020-06-19 23:03:26 +00:00
|
|
|
import 'package:flutter/widgets.dart';
|
2020-06-23 14:59:51 +00:00
|
|
|
import 'package:photos/core/cache/thumbnail_cache.dart';
|
|
|
|
import 'package:photos/core/constants.dart';
|
2020-06-19 23:03:26 +00:00
|
|
|
import 'package:photos/models/file.dart';
|
2020-06-20 23:51:10 +00:00
|
|
|
import 'package:photos/ui/video_controls.dart';
|
2020-06-19 23:03:26 +00:00
|
|
|
import 'package:video_player/video_player.dart';
|
|
|
|
|
|
|
|
import 'loading_widget.dart';
|
|
|
|
|
|
|
|
class VideoWidget extends StatefulWidget {
|
|
|
|
final File file;
|
2020-06-21 17:44:21 +00:00
|
|
|
final bool autoPlay;
|
|
|
|
VideoWidget(this.file, {this.autoPlay = false, Key key}) : super(key: key);
|
2020-06-19 23:03:26 +00:00
|
|
|
|
|
|
|
@override
|
|
|
|
_VideoWidgetState createState() => _VideoWidgetState();
|
|
|
|
}
|
|
|
|
|
|
|
|
class _VideoWidgetState extends State<VideoWidget> {
|
|
|
|
VideoPlayerController _videoPlayerController;
|
2020-06-23 14:59:51 +00:00
|
|
|
ChewieController _chewieController;
|
2020-06-19 23:03:26 +00:00
|
|
|
|
|
|
|
@override
|
|
|
|
void initState() {
|
|
|
|
super.initState();
|
2020-06-23 14:59:51 +00:00
|
|
|
if (widget.file.localId == null) {
|
|
|
|
_setVideoPlayerController(widget.file.getRemoteUrl());
|
|
|
|
} else {
|
|
|
|
widget.file.getAsset().then((asset) {
|
|
|
|
asset.getMediaUrl().then((url) {
|
|
|
|
_setVideoPlayerController(url);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
2020-06-19 23:03:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
void dispose() {
|
|
|
|
_videoPlayerController.dispose();
|
|
|
|
_chewieController.dispose();
|
|
|
|
super.dispose();
|
|
|
|
}
|
|
|
|
|
2020-06-23 14:59:51 +00:00
|
|
|
VideoPlayerController _setVideoPlayerController(String url) {
|
|
|
|
return _videoPlayerController = VideoPlayerController.network(url)
|
|
|
|
..initialize().whenComplete(() {
|
|
|
|
setState(() {});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2020-06-19 23:03:26 +00:00
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
2020-06-23 15:05:48 +00:00
|
|
|
final content = _videoPlayerController != null &&
|
2020-06-23 14:59:51 +00:00
|
|
|
_videoPlayerController.value.initialized
|
|
|
|
? _getVideoPlayer()
|
|
|
|
: _getLoadingWidget();
|
2020-06-23 15:05:48 +00:00
|
|
|
return Hero(
|
2020-06-23 19:04:28 +00:00
|
|
|
tag: widget.file.heroTag(),
|
2020-06-23 15:05:48 +00:00
|
|
|
child: content,
|
|
|
|
);
|
2020-06-23 14:59:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
Widget _getLoadingWidget() {
|
|
|
|
return Stack(children: [
|
|
|
|
_getThumbnail(),
|
|
|
|
loadWidget,
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
|
|
|
|
Center _getThumbnail() {
|
|
|
|
final thumbnail = widget.file.localId == null
|
|
|
|
? Image.network(widget.file.getThumbnailUrl())
|
|
|
|
: Image.memory(
|
|
|
|
ThumbnailLruCache.get(widget.file, THUMBNAIL_SMALL_SIZE));
|
|
|
|
return Center(child: thumbnail);
|
2020-06-19 23:03:26 +00:00
|
|
|
}
|
|
|
|
|
2020-06-23 14:59:51 +00:00
|
|
|
Widget _getVideoPlayer() {
|
2020-06-20 22:47:09 +00:00
|
|
|
_chewieController = ChewieController(
|
|
|
|
videoPlayerController: _videoPlayerController,
|
|
|
|
aspectRatio: _videoPlayerController.value.aspectRatio,
|
2020-06-21 17:44:21 +00:00
|
|
|
autoPlay: widget.autoPlay,
|
2020-06-20 22:47:09 +00:00
|
|
|
autoInitialize: true,
|
|
|
|
looping: true,
|
|
|
|
allowFullScreen: false,
|
2020-06-20 23:51:10 +00:00
|
|
|
customControls: VideoControls(),
|
2020-06-20 22:47:09 +00:00
|
|
|
);
|
2020-06-23 14:59:51 +00:00
|
|
|
return Chewie(controller: _chewieController);
|
2020-06-19 23:03:26 +00:00
|
|
|
}
|
|
|
|
}
|