import 'dart:io'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:video_player/video_player.dart'; class FullScreenVideoViewer extends StatefulWidget { final String videoUrl; final String heroTag; final File? videoFile; const FullScreenVideoViewer({super.key, required this.videoUrl, required this.heroTag, this.videoFile}); @override _FullScreenVideoViewerState createState() => _FullScreenVideoViewerState(); } class _FullScreenVideoViewerState extends State { late VideoPlayerController _controller; @override void initState() { super.initState(); _controller = widget.videoFile == null ? VideoPlayerController.networkUrl(Uri.parse(widget.videoUrl)) : VideoPlayerController.file(widget.videoFile!) ..initialize().then((_) { // Ensure the first frame is shown after the video is initialized, even before the play button has been pressed. setState(() {}); }); _controller.setLooping(true); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( elevation: 0.0, backgroundColor: Colors.black, iconTheme: const IconThemeData(color: Colors.white), systemOverlayStyle: SystemUiOverlayStyle.light, ), body: Container( color: Colors.black, child: Hero( tag: widget.videoUrl, child: Center( child: _controller.value.isInitialized ? AspectRatio( aspectRatio: _controller.value.aspectRatio, child: VideoPlayer(_controller), ) : Container(), ), )), floatingActionButton: FloatingActionButton( heroTag: widget.heroTag, onPressed: () { setState(() { _controller.value.isPlaying ? _controller.pause() : _controller.play(); }); }, child: Icon( _controller.value.isPlaying ? CupertinoIcons.pause : CupertinoIcons.play_arrow_solid, ), ), floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat, ); } @override void dispose() { super.dispose(); _controller.dispose(); } }