From e8223c9ff3008bf8f70524904159d2f978a5a085 Mon Sep 17 00:00:00 2001 From: Xin Yao Date: Mon, 19 Jul 2021 13:55:57 -0700 Subject: [PATCH] Add video player --- lib/src/widgets/simple_viewer.dart | 4 ++ lib/src/widgets/video_app.dart | 66 ++++++++++++++++++++++++++++++ pubspec.yaml | 1 + 3 files changed, 71 insertions(+) create mode 100644 lib/src/widgets/video_app.dart diff --git a/lib/src/widgets/simple_viewer.dart b/lib/src/widgets/simple_viewer.dart index 559e5e1a..d1707595 100644 --- a/lib/src/widgets/simple_viewer.dart +++ b/lib/src/widgets/simple_viewer.dart @@ -5,6 +5,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; +import 'package:flutter_quill/src/widgets/video_app.dart'; import 'package:string_validator/string_validator.dart'; import 'package:tuple/tuple.dart'; @@ -107,6 +108,9 @@ class _QuillSimpleViewerState extends State : isBase64(imageUrl) ? Image.memory(base64.decode(imageUrl)) : Image.file(io.File(imageUrl)); + case 'video': + final videoUrl = node.value.data; + return VideoApp(videoUrl: videoUrl); default: throw UnimplementedError( 'Embeddable type "${node.value.type}" is not supported by default ' diff --git a/lib/src/widgets/video_app.dart b/lib/src/widgets/video_app.dart new file mode 100644 index 00000000..9598c27a --- /dev/null +++ b/lib/src/widgets/video_app.dart @@ -0,0 +1,66 @@ +import 'package:flutter/material.dart'; +import 'package:video_player/video_player.dart'; + +/// Widget for playing back video +/// Refer to https://github.com/flutter/plugins/tree/master/packages/video_player/video_player +class VideoApp extends StatefulWidget { + const VideoApp({required this.videoUrl}); + final String videoUrl; + + @override + _VideoAppState createState() => _VideoAppState(); +} + +class _VideoAppState extends State { + late VideoPlayerController _controller; + + @override + void initState() { + super.initState(); + + _controller = VideoPlayerController.asset(widget.videoUrl) + ..initialize().then((_) { + // Ensure the first frame is shown after the video is initialized, + // even before the play button has been pressed. + setState(() {}); + }); + } + + @override + Widget build(BuildContext context) { + return Container( + height: 300, + child: InkWell( + onTap: () { + setState(() { + _controller.value.isPlaying + ? _controller.pause() + : _controller.play(); + }); + }, + child: Stack(alignment: Alignment.center, children: [ + Center( + child: _controller.value.isInitialized + ? AspectRatio( + aspectRatio: _controller.value.aspectRatio, + child: VideoPlayer(_controller), + ) + : const CircularProgressIndicator()), + _controller.value.isPlaying || !_controller.value.isInitialized + ? const SizedBox.shrink() + : const Icon( + Icons.play_arrow, + size: 60, + color: Colors.white, + ) + ]), + ), + ); + } + + @override + void dispose() { + super.dispose(); + _controller.dispose(); + } +} diff --git a/pubspec.yaml b/pubspec.yaml index 039a3e6c..36abb395 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -22,6 +22,7 @@ dependencies: tuple: ^2.0.0 url_launcher: ^6.0.2 pedantic: ^1.11.0 + video_player: ^2.1.10 dev_dependencies: flutter_test: