v1.1.0: Major refactoring and improvements

This commit is contained in:
2026-02-25 23:57:26 -03:00
parent 5d38b89a53
commit 7911af217f
8 changed files with 1304 additions and 1143 deletions

View File

@@ -1,5 +1,4 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:video_player/video_player.dart';
import 'package:chewie/chewie.dart';
import '../models/xtream_models.dart';
@@ -8,18 +7,14 @@ class PlayerScreen extends StatefulWidget {
final XtreamStream stream;
final bool isLive;
const PlayerScreen({
super.key,
required this.stream,
this.isLive = true,
});
const PlayerScreen({super.key, required this.stream, this.isLive = true});
@override
State<PlayerScreen> createState() => _PlayerScreenState();
}
class _PlayerScreenState extends State<PlayerScreen> {
late VideoPlayerController _videoController;
VideoPlayerController? _videoController;
ChewieController? _chewieController;
bool _isLoading = true;
String? _error;
@@ -32,20 +27,32 @@ class _PlayerScreenState extends State<PlayerScreen> {
Future<void> _initPlayer() async {
try {
_chewieController?.dispose();
_chewieController = null;
await _videoController?.dispose();
_videoController = null;
final url = widget.stream.url;
if (url == null || url.isEmpty) {
throw Exception('No stream URL available');
}
_videoController = VideoPlayerController.networkUrl(Uri.parse(url));
await _videoController.initialize();
final videoController = VideoPlayerController.networkUrl(
Uri.parse(url),
videoPlayerOptions: VideoPlayerOptions(
allowBackgroundPlayback: false,
mixWithOthers: false,
),
);
await videoController.initialize();
_videoController = videoController;
_chewieController = ChewieController(
videoPlayerController: _videoController,
videoPlayerController: videoController,
autoPlay: true,
looping: widget.isLive,
aspectRatio: _videoController.value.aspectRatio,
aspectRatio: videoController.value.aspectRatio,
allowFullScreen: true,
allowMuting: true,
showControls: true,
@@ -76,10 +83,6 @@ class _PlayerScreenState extends State<PlayerScreen> {
setState(() {
_isLoading = false;
});
_videoController.addListener(() {
setState(() {});
});
} catch (e) {
setState(() {
_error = e.toString();
@@ -90,7 +93,7 @@ class _PlayerScreenState extends State<PlayerScreen> {
@override
void dispose() {
_videoController.dispose();
_videoController?.dispose();
_chewieController?.dispose();
super.dispose();
}
@@ -112,13 +115,13 @@ class _PlayerScreenState extends State<PlayerScreen> {
child: _isLoading
? const CircularProgressIndicator(color: Colors.red)
: _error != null
? _buildError()
: _chewieController != null
? Chewie(controller: _chewieController!)
: const Text(
'No video available',
style: TextStyle(color: Colors.white),
),
? _buildError()
: _chewieController != null
? Chewie(controller: _chewieController!)
: const Text(
'No video available',
style: TextStyle(color: Colors.white),
),
),
);
}