import 'dart:io'; import 'package:flutter/material.dart'; import 'package:video_player/video_player.dart'; class VideoWidget extends StatefulWidget { final dynamic url; final double width; const VideoWidget({super.key, this.width = 140, required this.url}); @override VideoWidgetState createState() => VideoWidgetState(); } class VideoWidgetState extends State { late VideoPlayerController _controller; late Future _initializeVideoPlayerFuture; @override void initState() { super.initState(); _controller = widget.url is File ? VideoPlayerController.file( widget.url, ) : VideoPlayerController.network( widget.url, ); _initializeVideoPlayerFuture = _controller.initialize(); } @override void dispose() { _controller.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return SizedBox( width: widget.width, height: MediaQuery.of(context).size.height, child: FutureBuilder( future: _initializeVideoPlayerFuture, builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.done) { return ClipRRect( borderRadius: BorderRadius.circular(12), child: Stack(children: [ VideoPlayer(_controller), Center( child: InkWell( onTap: () { if (_controller.value.isPlaying) { _controller.pause(); } else { _controller.play(); } setState(() {}); }, child: Icon( _controller.value.isPlaying ? Icons.pause : Icons.play_arrow, color: Colors.white, )), ) ]), ); } else { return const Center( child: CircularProgressIndicator(), ); } }, ), ); } } class VideoAdvWidget extends StatefulWidget { final dynamic url; final double width; final double? height; const VideoAdvWidget({super.key, this.height, this.width = 140, required this.url}); @override VideoAdvWidgetState createState() => VideoAdvWidgetState(); } class VideoAdvWidgetState extends State { late VideoPlayerController _controller; late Future _initializeVideoPlayerFuture; @override void initState() { super.initState(); _controller = widget.url is File ? VideoPlayerController.file( widget.url, ) : VideoPlayerController.network( widget.url, ); _initializeVideoPlayerFuture = _controller.initialize(); _controller.play(); _controller.setLooping(true); _controller.setVolume(0); } @override void dispose() { _controller.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return SizedBox( width: widget.width, height: widget.height ?? MediaQuery.of(context).size.height, child: FutureBuilder( future: _initializeVideoPlayerFuture, builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.done) { return ClipRRect( borderRadius: BorderRadius.only(topLeft: Radius.circular(12), topRight: Radius.circular(12)), child: Stack(children: [ VideoPlayer(_controller), Center( child: InkWell( onTap: () { if (_controller.value.isPlaying) { _controller.pause(); } else { _controller.play(); } setState(() {}); }, child: SizedBox( width: 100, height: 100, )), ) ]), ); } else { return const Center( child: CircularProgressIndicator(), ); } }, ), ); } }