INFRA: Set Up Project.
This commit is contained in:
159
lib/widget/video_widget.dart
Normal file
159
lib/widget/video_widget.dart
Normal file
@@ -0,0 +1,159 @@
|
||||
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<VideoWidget> {
|
||||
late VideoPlayerController _controller;
|
||||
late Future<void> _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<VideoAdvWidget> {
|
||||
late VideoPlayerController _controller;
|
||||
late Future<void> _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(),
|
||||
);
|
||||
}
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user