import 'dart:math'; import 'package:flutter/material.dart'; import 'package:video_player/video_player.dart'; class VideoPlayerLibAvControl extends StatefulWidget { final String videoUrl; final double width; final double height; const VideoPlayerLibAvControl({ super.key, required this.videoUrl, required this.width, required this.height, }); @override State createState() => _VideoPlayerLibAvControlState(); } class _VideoPlayerLibAvControlState extends State { late final VideoPlayerController videoPlayerController; @override void initState() { super.initState(); videoPlayerController = VideoPlayerController.network(widget.videoUrl) ..initialize().then((_) { setState(() {}); }); } @override void dispose() { videoPlayerController.dispose(); super.dispose(); } @override void deactivate() { videoPlayerController.pause(); super.deactivate(); } void toggleVideoPlay() { videoPlayerController.value.isPlaying ? videoPlayerController.pause() : videoPlayerController.play(); setState(() {}); } @override Widget build(BuildContext context) { final size = videoPlayerController.value.size; final horizontalScale = size.width / widget.width; final verticalScale = size.height / widget.height; final scaling = min(horizontalScale, verticalScale); final videoWidth = scaling * size.width; final videoHeight = scaling * size.height; if (!videoPlayerController.value.isInitialized) { return SizedBox( width: videoWidth, height: videoHeight, child: const Card( color: Colors.black12, shape: RoundedRectangleBorder(), child: CircularProgressIndicator(), ), ); } return GestureDetector( onTap: toggleVideoPlay, child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ SizedBox( width: videoWidth, height: videoHeight, child: AspectRatio( aspectRatio: videoPlayerController.value.aspectRatio, child: VideoPlayer(videoPlayerController), ), ), Row( children: [ IconButton( icon: videoPlayerController.value.isPlaying ? const Icon(Icons.pause) : const Icon(Icons.play_arrow), onPressed: toggleVideoPlay, ), IconButton( onPressed: () { videoPlayerController.seekTo(Duration.zero); }, icon: const Icon(Icons.replay)), ], ) ], ), ); } }