video_widget.dart 2.8 KB

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