video_widget.dart 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import 'package:chewie/chewie.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter/widgets.dart';
  4. import 'package:photos/core/cache/thumbnail_cache.dart';
  5. import 'package:photos/core/constants.dart';
  6. import 'package:photos/models/file.dart';
  7. import 'package:photos/ui/video_controls.dart';
  8. import 'package:video_player/video_player.dart';
  9. import 'loading_widget.dart';
  10. class VideoWidget extends StatefulWidget {
  11. final File file;
  12. final bool autoPlay;
  13. VideoWidget(this.file, {this.autoPlay = false, Key key}) : super(key: key);
  14. @override
  15. _VideoWidgetState createState() => _VideoWidgetState();
  16. }
  17. class _VideoWidgetState extends State<VideoWidget> {
  18. VideoPlayerController _videoPlayerController;
  19. ChewieController _chewieController;
  20. @override
  21. void initState() {
  22. super.initState();
  23. if (widget.file.localId == null) {
  24. _setVideoPlayerController(widget.file.getRemoteUrl());
  25. } else {
  26. widget.file.getAsset().then((asset) {
  27. asset.getMediaUrl().then((url) {
  28. _setVideoPlayerController(url);
  29. });
  30. });
  31. }
  32. }
  33. @override
  34. void dispose() {
  35. _videoPlayerController.dispose();
  36. _chewieController.dispose();
  37. super.dispose();
  38. }
  39. VideoPlayerController _setVideoPlayerController(String url) {
  40. return _videoPlayerController = VideoPlayerController.network(url)
  41. ..initialize().whenComplete(() {
  42. setState(() {});
  43. });
  44. }
  45. @override
  46. Widget build(BuildContext context) {
  47. final content = _videoPlayerController != null &&
  48. _videoPlayerController.value.initialized
  49. ? _getVideoPlayer()
  50. : _getLoadingWidget();
  51. return Hero(
  52. tag: widget.file.generatedId.toString(),
  53. child: content,
  54. );
  55. }
  56. Widget _getLoadingWidget() {
  57. return Stack(children: [
  58. _getThumbnail(),
  59. loadWidget,
  60. ]);
  61. }
  62. Center _getThumbnail() {
  63. final thumbnail = widget.file.localId == null
  64. ? Image.network(widget.file.getThumbnailUrl())
  65. : Image.memory(
  66. ThumbnailLruCache.get(widget.file, THUMBNAIL_SMALL_SIZE));
  67. return Center(child: thumbnail);
  68. }
  69. Widget _getVideoPlayer() {
  70. _chewieController = ChewieController(
  71. videoPlayerController: _videoPlayerController,
  72. aspectRatio: _videoPlayerController.value.aspectRatio,
  73. autoPlay: widget.autoPlay,
  74. autoInitialize: true,
  75. looping: true,
  76. allowFullScreen: false,
  77. customControls: VideoControls(),
  78. );
  79. return Chewie(controller: _chewieController);
  80. }
  81. }