😋 初始化仓库
This commit is contained in:
203
lib/services/notification_service.dart
Normal file
203
lib/services/notification_service.dart
Normal file
@@ -0,0 +1,203 @@
|
||||
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
|
||||
/// Service for managing local notifications
|
||||
/// Handles batch evaluation progress notifications and completion alerts
|
||||
///
|
||||
/// Usage example:
|
||||
/// ```dart
|
||||
/// final notificationService = NotificationService();
|
||||
/// await notificationService.initialize();
|
||||
///
|
||||
/// // Set up tap callback
|
||||
/// notificationService.onNotificationTapped = (payload) {
|
||||
/// // Handle navigation based on payload
|
||||
/// if (payload == 'batch_complete') {
|
||||
/// // Navigate to results screen
|
||||
/// }
|
||||
/// };
|
||||
///
|
||||
/// // Show batch start notification
|
||||
/// await notificationService.showBatchStartNotification(10);
|
||||
///
|
||||
/// // Update progress
|
||||
/// await notificationService.updateProgressNotification(
|
||||
/// current: 5,
|
||||
/// total: 10,
|
||||
/// courseName: '高等数学',
|
||||
/// );
|
||||
///
|
||||
/// // Show completion
|
||||
/// await notificationService.showCompletionNotification(
|
||||
/// success: 9,
|
||||
/// failed: 1,
|
||||
/// total: 10,
|
||||
/// );
|
||||
/// ```
|
||||
class NotificationService {
|
||||
static const String _channelId = 'evaluation_progress';
|
||||
static const String _channelName = '评教进度';
|
||||
static const String _channelDescription = '显示批量评教的实时进度';
|
||||
|
||||
static const int _batchNotificationId = 1000;
|
||||
static const int _progressNotificationId = 1001;
|
||||
static const int _completionNotificationId = 1002;
|
||||
static const int _errorNotificationId = 1003;
|
||||
|
||||
final FlutterLocalNotificationsPlugin _notifications;
|
||||
bool _isInitialized = false;
|
||||
|
||||
// Callback for when notification is tapped
|
||||
Function(String?)? onNotificationTapped;
|
||||
|
||||
NotificationService() : _notifications = FlutterLocalNotificationsPlugin();
|
||||
|
||||
/// Initialize the notification service
|
||||
///
|
||||
/// Configures notification channels for Android and iOS
|
||||
/// Sets up notification icons and default settings
|
||||
///
|
||||
/// Returns true if initialization succeeds, false otherwise
|
||||
Future<bool> initialize() async {
|
||||
if (_isInitialized) {
|
||||
return true;
|
||||
}
|
||||
|
||||
try {
|
||||
// Android initialization settings
|
||||
const androidSettings = AndroidInitializationSettings(
|
||||
'@mipmap/ic_launcher',
|
||||
);
|
||||
|
||||
// iOS initialization settings
|
||||
const iosSettings = DarwinInitializationSettings(
|
||||
requestAlertPermission: true,
|
||||
requestBadgePermission: true,
|
||||
requestSoundPermission: true,
|
||||
);
|
||||
|
||||
// Combined initialization settings
|
||||
const initSettings = InitializationSettings(
|
||||
android: androidSettings,
|
||||
iOS: iosSettings,
|
||||
);
|
||||
|
||||
// Initialize the plugin
|
||||
final initialized = await _notifications.initialize(
|
||||
initSettings,
|
||||
onDidReceiveNotificationResponse: _onNotificationTapped,
|
||||
onDidReceiveBackgroundNotificationResponse: _onNotificationTapped,
|
||||
);
|
||||
|
||||
if (initialized == true) {
|
||||
// Create notification channel for Android
|
||||
await _createNotificationChannel();
|
||||
_isInitialized = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
} catch (e) {
|
||||
debugPrint('Failed to initialize notification service: $e');
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// Create Android notification channel
|
||||
///
|
||||
/// Sets up a high-priority channel for evaluation progress notifications
|
||||
Future<void> _createNotificationChannel() async {
|
||||
const androidChannel = AndroidNotificationChannel(
|
||||
_channelId,
|
||||
_channelName,
|
||||
description: _channelDescription,
|
||||
importance: Importance.high,
|
||||
enableVibration: true,
|
||||
playSound: true,
|
||||
);
|
||||
|
||||
await _notifications
|
||||
.resolvePlatformSpecificImplementation<
|
||||
AndroidFlutterLocalNotificationsPlugin
|
||||
>()
|
||||
?.createNotificationChannel(androidChannel);
|
||||
}
|
||||
|
||||
/// Handle notification tap events
|
||||
///
|
||||
/// Called when user taps on a notification
|
||||
/// Triggers the callback to allow navigation to specific screens
|
||||
void _onNotificationTapped(NotificationResponse response) {
|
||||
debugPrint('Notification tapped: ${response.payload}');
|
||||
|
||||
// Trigger the callback if set
|
||||
if (onNotificationTapped != null) {
|
||||
onNotificationTapped!(response.payload);
|
||||
}
|
||||
}
|
||||
|
||||
/// Check if the service is initialized
|
||||
bool get isInitialized => _isInitialized;
|
||||
|
||||
/// Show notification when batch evaluation starts
|
||||
///
|
||||
/// [totalCourses] - Total number of courses to evaluate
|
||||
Future<void> showBatchStartNotification(int totalCourses) async {
|
||||
// Notification service disabled
|
||||
return;
|
||||
}
|
||||
|
||||
/// Update progress notification with current status
|
||||
///
|
||||
/// Shows a progress bar and current course being evaluated
|
||||
///
|
||||
/// [current] - Number of courses completed
|
||||
/// [total] - Total number of courses
|
||||
/// [courseName] - Name of the current course being evaluated
|
||||
Future<void> updateProgressNotification({
|
||||
required int current,
|
||||
required int total,
|
||||
required String courseName,
|
||||
}) async {
|
||||
// Notification service disabled
|
||||
return;
|
||||
}
|
||||
|
||||
/// Show completion notification with final statistics
|
||||
///
|
||||
/// [success] - Number of successfully evaluated courses
|
||||
/// [failed] - Number of failed evaluations
|
||||
/// [total] - Total number of courses
|
||||
Future<void> showCompletionNotification({
|
||||
required int success,
|
||||
required int failed,
|
||||
required int total,
|
||||
}) async {
|
||||
// Notification service disabled
|
||||
return;
|
||||
}
|
||||
|
||||
/// Show error notification
|
||||
///
|
||||
/// [message] - Error message to display
|
||||
Future<void> showErrorNotification(String message) async {
|
||||
// Notification service disabled
|
||||
return;
|
||||
}
|
||||
|
||||
/// Cancel all active notifications
|
||||
///
|
||||
/// Clears all notifications from the notification tray
|
||||
Future<void> cancelAll() async {
|
||||
if (!_isInitialized) {
|
||||
debugPrint('Notification service not initialized');
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
await _notifications.cancelAll();
|
||||
} catch (e) {
|
||||
debugPrint('Failed to cancel notifications: $e');
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user