mirror of
https://gitlab.com/foxixus/neomovies_mobile.git
synced 2025-10-27 19:58:50 +05:00
Problem: - Gray screens without error messages made debugging impossible - Users couldn't see what went wrong - Developers couldn't debug issues without full stack traces Solution: 1. Created ErrorDisplay widget (lib/presentation/widgets/error_display.dart): ✅ Shows detailed error message with copy button ✅ Expandable stack trace section with syntax highlighting ✅ Retry button for failed operations ✅ Debug tips for troubleshooting ✅ Beautiful UI with icons, colors, and proper styling ✅ Fully selectable text for easy copying Features: - 🔴 Red error card with full error message - 🟠 Orange expandable stack trace panel - 🔵 Blue tips panel with debugging suggestions - 📋 Copy buttons for error and stack trace - 🔄 Retry button to attempt operation again - 📱 Responsive scrolling for long errors 2. Updated MovieDetailProvider: ✅ Added _stackTrace field to store full stack trace ✅ Save stack trace in catch block: catch (e, stackTrace) ✅ Expose via getter: String? get stackTrace 3. Updated DownloadsProvider: ✅ Added _stackTrace field ✅ Updated _setError() to accept optional stackTrace parameter ✅ Save stack trace in refreshDownloads() catch block ✅ Print error and stack trace to console 4. Updated MovieDetailScreen: ✅ Replaced simple Text('Error: ...') with ErrorDisplay widget ✅ Shows 'Ошибка загрузки фильма/сериала' title ✅ Pass error, stackTrace, and onRetry callback ✅ Retry attempts to reload media 5. Updated DownloadsScreen: ✅ Replaced custom error UI with ErrorDisplay widget ✅ Shows 'Ошибка загрузки торрентов' title ✅ Pass error, stackTrace, and onRetry callback ✅ Retry attempts to refresh downloads Error Display Features: ---------------------------- 📋 Сообщение об ошибке: [Red card with full error text] [Copy button] 🐛 Stack Trace (для разработчиков): [Expandable orange section] [Black terminal-style with green text] [Copy stack trace button] 💡 Советы по отладке: • Скопируйте ошибку и отправьте разработчику • Проверьте соединение с интернетом • Проверьте логи Flutter в консоли • Попробуйте перезапустить приложение 🔄 [Попробовать снова] button Example Error Display: ---------------------- ┌────────────────────────────────────┐ │ ⚠️ Произошла ошибка │ │ │ │ 📋 Сообщение об ошибке: │ │ ┌──────────────────────────────┐ │ │ │ Exception: Failed to load │ │ │ │ movie: 404 - Not Found │ │ │ │ [Копировать ошибку] │ │ │ └──────────────────────────────┘ │ │ │ │ 🐛 Stack Trace ▶ │ │ │ │ 💡 Советы по отладке: │ │ ┌──────────────────────────────┐ │ │ │ • Скопируйте ошибку... │ │ │ │ • Проверьте соединение... │ │ │ └──────────────────────────────┘ │ │ │ │ [🔄 Попробовать снова] │ └────────────────────────────────────┘ Changes: - lib/presentation/widgets/error_display.dart (NEW): 254 lines - lib/presentation/providers/movie_detail_provider.dart: +4 lines - lib/presentation/providers/downloads_provider.dart: +6 lines - lib/presentation/screens/movie_detail/movie_detail_screen.dart: +11/-2 lines - lib/presentation/screens/downloads/downloads_screen.dart: +4/-27 lines Result: ✅ No more gray screens without explanation! ✅ Full error messages visible on screen ✅ Stack traces available for developers ✅ Copy button for easy error reporting ✅ Retry button for quick recovery ✅ Beautiful, user-friendly error UI ✅ Much easier debugging process Testing: -------- 1. Open app and tap on a movie card 2. If error occurs, you'll see: - Full error message in red card - Stack trace in expandable section - Copy buttons for error and stack trace - Retry button to try again 3. Same for Downloads screen Now debugging is 10x easier! 🎉
83 lines
2.3 KiB
Dart
83 lines
2.3 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:neomovies_mobile/data/models/movie.dart';
|
|
import 'package:neomovies_mobile/data/repositories/movie_repository.dart';
|
|
import 'package:neomovies_mobile/data/api/api_client.dart';
|
|
|
|
class MovieDetailProvider with ChangeNotifier {
|
|
final MovieRepository _movieRepository;
|
|
final ApiClient _apiClient;
|
|
|
|
MovieDetailProvider(this._movieRepository, this._apiClient);
|
|
|
|
bool _isLoading = false;
|
|
bool get isLoading => _isLoading;
|
|
|
|
bool _isImdbLoading = false;
|
|
bool get isImdbLoading => _isImdbLoading;
|
|
|
|
Movie? _movie;
|
|
Movie? get movie => _movie;
|
|
|
|
String? _imdbId;
|
|
String? get imdbId => _imdbId;
|
|
|
|
String? _error;
|
|
String? get error => _error;
|
|
|
|
String? _stackTrace;
|
|
String? get stackTrace => _stackTrace;
|
|
|
|
Future<void> loadMedia(int mediaId, String mediaType) async {
|
|
_isLoading = true;
|
|
_isImdbLoading = true;
|
|
_error = null;
|
|
_movie = null;
|
|
_imdbId = null;
|
|
notifyListeners();
|
|
|
|
try {
|
|
print('Loading media: ID=$mediaId, type=$mediaType');
|
|
|
|
// Load movie/TV details
|
|
if (mediaType == 'movie') {
|
|
_movie = await _movieRepository.getMovieById(mediaId.toString());
|
|
print('Movie loaded successfully: ${_movie?.title}');
|
|
} else {
|
|
_movie = await _movieRepository.getTvById(mediaId.toString());
|
|
print('TV show loaded successfully: ${_movie?.title}');
|
|
}
|
|
|
|
_isLoading = false;
|
|
notifyListeners();
|
|
|
|
// Try to load IMDb ID (non-blocking)
|
|
if (_movie != null) {
|
|
try {
|
|
print('Loading IMDb ID for $mediaType $mediaId');
|
|
_imdbId = await _apiClient.getImdbId(mediaId.toString(), mediaType);
|
|
print('IMDb ID loaded: $_imdbId');
|
|
} catch (e) {
|
|
// IMDb ID loading failed, but don't fail the whole screen
|
|
print('Failed to load IMDb ID: $e');
|
|
_imdbId = null;
|
|
}
|
|
}
|
|
} catch (e, stackTrace) {
|
|
print('Error loading media: $e');
|
|
print('Stack trace: $stackTrace');
|
|
_error = e.toString();
|
|
_stackTrace = stackTrace.toString();
|
|
_isLoading = false;
|
|
notifyListeners();
|
|
} finally {
|
|
_isImdbLoading = false;
|
|
notifyListeners();
|
|
}
|
|
}
|
|
|
|
// Backward compatibility
|
|
Future<void> loadMovie(int movieId) async {
|
|
await loadMedia(movieId, 'movie');
|
|
}
|
|
}
|