117 lines
3.7 KiB
Dart
117 lines
3.7 KiB
Dart
import 'package:flutter/material.dart';
|
||
import 'package:video_player/video_player.dart';
|
||
import 'package:chewie/chewie.dart';
|
||
|
||
class FullScreenVideoPlayer extends StatefulWidget {
|
||
final String videoUrl;
|
||
|
||
const FullScreenVideoPlayer({Key? key, required this.videoUrl})
|
||
: super(key: key);
|
||
|
||
@override
|
||
State<FullScreenVideoPlayer> createState() => _FullScreenVideoPlayerState();
|
||
}
|
||
|
||
class _FullScreenVideoPlayerState extends State<FullScreenVideoPlayer> {
|
||
VideoPlayerController? _videoPlayerController;
|
||
ChewieController? _chewieController;
|
||
bool _isLoading = true;
|
||
bool _hasError = false;
|
||
|
||
@override
|
||
void initState() {
|
||
super.initState();
|
||
_initializePlayer();
|
||
}
|
||
|
||
Future<void> _initializePlayer() async {
|
||
try {
|
||
_videoPlayerController = VideoPlayerController.networkUrl(
|
||
Uri.parse(widget.videoUrl),
|
||
httpHeaders: const {
|
||
|
||
'User-Agent':
|
||
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
|
||
},
|
||
);
|
||
|
||
await _videoPlayerController!.initialize();
|
||
|
||
_chewieController = ChewieController(
|
||
videoPlayerController: _videoPlayerController!,
|
||
aspectRatio: _videoPlayerController!.value.aspectRatio,
|
||
autoPlay: true, // Начинаем воспроизведение сразу
|
||
looping: false, // Не зацикливаем
|
||
showControls: true, // Показываем стандартные элементы управления Chewie
|
||
materialProgressColors: ChewieProgressColors(
|
||
playedColor: Colors.red,
|
||
handleColor: Colors.blueAccent,
|
||
backgroundColor: Colors.grey,
|
||
bufferedColor: Colors.white,
|
||
),
|
||
|
||
);
|
||
|
||
if (mounted) {
|
||
setState(() {
|
||
_isLoading = false;
|
||
});
|
||
}
|
||
} catch (e) {
|
||
print('❌ [FullScreenVideoPlayer] Error initializing Chewie player: $e');
|
||
if (mounted) {
|
||
setState(() {
|
||
_hasError = true;
|
||
_isLoading = false;
|
||
});
|
||
}
|
||
}
|
||
}
|
||
|
||
@override
|
||
void dispose() {
|
||
_videoPlayerController?.dispose();
|
||
_chewieController?.dispose();
|
||
super.dispose();
|
||
}
|
||
|
||
@override
|
||
Widget build(BuildContext context) {
|
||
return Scaffold(
|
||
backgroundColor: Colors.black, // Черный фон для полноэкранного видео
|
||
appBar: AppBar(
|
||
backgroundColor: Colors.black,
|
||
iconTheme: const IconThemeData(color: Colors.white),
|
||
title: const Text('Видео', style: TextStyle(color: Colors.white)),
|
||
),
|
||
body: Center(
|
||
child: _isLoading
|
||
? const CircularProgressIndicator(color: Colors.white)
|
||
: _hasError
|
||
? const Column(
|
||
mainAxisAlignment: MainAxisAlignment.center,
|
||
children: [
|
||
Icon(Icons.error_outline, color: Colors.red, size: 50),
|
||
SizedBox(height: 10),
|
||
Text(
|
||
'Не удалось загрузить видео.',
|
||
style: TextStyle(color: Colors.white, fontSize: 16),
|
||
),
|
||
Text(
|
||
'Проверьте интернет или попробуйте позже.',
|
||
style: TextStyle(color: Colors.white70, fontSize: 12),
|
||
),
|
||
],
|
||
)
|
||
: _chewieController != null &&
|
||
_chewieController!.videoPlayerController.value.isInitialized
|
||
? Chewie(controller: _chewieController!)
|
||
: const Text(
|
||
'Ошибка плеера',
|
||
style: TextStyle(color: Colors.white),
|
||
),
|
||
),
|
||
);
|
||
}
|
||
}
|