|
@@ -19,6 +19,7 @@ class VideoPlayerWidget extends StatefulWidget {
|
|
|
class _VideoPlayerWidgetState extends State<VideoPlayerWidget> {
|
|
|
late final CachedVideoPlayerPlus _player;
|
|
|
bool _isInitialized = false;
|
|
|
+ bool _isDisposed = false;
|
|
|
bool _hasError = false;
|
|
|
bool _usingCache = false;
|
|
|
double _downloadProgress = 0;
|
|
@@ -45,11 +46,13 @@ class _VideoPlayerWidgetState extends State<VideoPlayerWidget> {
|
|
|
);
|
|
|
|
|
|
await _player.initialize();
|
|
|
+ if (_isDisposed)
|
|
|
+ return;
|
|
|
_player.controller.addListener(_videoListener);
|
|
|
setState(() => _isInitialized = true);
|
|
|
_player.controller.play();
|
|
|
} catch (e) {
|
|
|
- _handleError("Player init error: $e");
|
|
|
+ _handleError("Player init error: $e");
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -64,7 +67,7 @@ class _VideoPlayerWidgetState extends State<VideoPlayerWidget> {
|
|
|
// Handle buffering updates
|
|
|
final isBuffering = _player.controller.value.isBuffering;
|
|
|
if (isBuffering != _isBuffering) {
|
|
|
- setState(() => _isBuffering = isBuffering);
|
|
|
+ //setState(() => _isBuffering = isBuffering);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -232,7 +235,7 @@ class _VideoPlayerWidgetState extends State<VideoPlayerWidget> {
|
|
|
}
|
|
|
|
|
|
Future<void> _handleVisibilityChange(bool visible) async {
|
|
|
- if (!visible) {
|
|
|
+ if (!visible && _isInitialized && !_isDisposed) {
|
|
|
await _player.controller.pause();
|
|
|
}
|
|
|
}
|
|
@@ -345,8 +348,10 @@ class _VideoPlayerWidgetState extends State<VideoPlayerWidget> {
|
|
|
@override
|
|
|
void dispose() {
|
|
|
_hideTimer?.cancel();
|
|
|
- _player.controller.removeListener(_videoListener);
|
|
|
- _player.dispose();
|
|
|
+ if (_isInitialized)
|
|
|
+ _player?.controller?.removeListener(_videoListener);
|
|
|
+ _isDisposed = true;
|
|
|
+ _player?.dispose();
|
|
|
super.dispose();
|
|
|
}
|
|
|
}
|