Files
TravelMate/lib/services/error_service.dart

125 lines
4.2 KiB
Dart
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import 'package:flutter/material.dart';
import '../components/error/error_content.dart';
import 'logger_service.dart';
/// Service for handling application errors and user notifications.
///
/// This singleton service provides centralized error handling capabilities
/// including displaying error dialogs, snackbars, and logging errors for
/// debugging purposes. It uses a global navigator key to show notifications
/// from anywhere in the application.
class ErrorService {
static final ErrorService _instance = ErrorService._internal();
/// Factory constructor that returns the singleton instance.
factory ErrorService() => _instance;
/// Private constructor for singleton pattern.
ErrorService._internal();
/// Global navigator key for accessing context from anywhere in the app.
///
/// This key should be assigned to the MaterialApp's navigatorKey property
/// to enable error notifications from any part of the application.
static GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
/// Displays an error message in a dialog.
///
/// Shows a modal dialog with the error message and optional retry functionality.
/// The dialog appearance can be customized with different icons and colors.
///
/// [message] - The error message to display
/// [title] - The dialog title (defaults to 'Error')
/// [onRetry] - Optional callback for retry functionality
/// [icon] - Icon to display in the dialog
/// [iconColor] - Color of the icon
void showError({
required String message,
String title = 'Error',
VoidCallback? onRetry,
IconData icon = Icons.error_outline,
Color? iconColor,
}) {
final context = navigatorKey.currentContext;
if (context != null) {
showErrorDialog(
context,
title: title,
message: message,
icon: icon,
iconColor: iconColor,
onRetry: onRetry,
);
}
}
/// Displays an error or success message in a snackbar.
///
/// Shows a floating snackbar at the bottom of the screen with the message.
/// The appearance changes based on whether it's an error or success message.
///
/// [message] - The message to display
/// [onRetry] - Optional callback for retry functionality
/// [isError] - Whether this is an error (true) or success (false) message
void showSnackbar({
required String message,
VoidCallback? onRetry,
bool isError = true,
}) {
final context = navigatorKey.currentContext;
if (context != null) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(message),
backgroundColor: isError ? Colors.red[400] : Colors.green[600],
duration: const Duration(seconds: 4),
action: onRetry != null
? SnackBarAction(
label: 'Retry',
textColor: Colors.white,
onPressed: onRetry,
)
: null,
behavior: SnackBarBehavior.floating,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
),
),
);
}
}
/// Logs error messages to the console during development.
///
/// Formats and displays error information including source, error message,
/// and optional stack trace in a visually distinct format.
///
/// [source] - The source or location where the error occurred
/// [error] - The error object or message
/// [stackTrace] - Optional stack trace for debugging
void logError(String source, dynamic error, [StackTrace? stackTrace]) {
LoggerService.error(
'❌ ERROR in $source\nMessage: $error',
name: source,
error: error,
stackTrace: stackTrace,
);
}
/// Logs informational messages to the console during development.
///
/// [source] - The source or location of the information
/// [message] - The informational message
void logInfo(String source, String message) {
LoggerService.info(' $message', name: source);
}
/// Logs success messages to the console during development.
///
/// [source] - The source or location of the success
/// [message] - The success message
void logSuccess(String source, String message) {
LoggerService.info('$message', name: source);
}
}