worldhopper/lib/app.dart
Felipe M. d2497f8aed
All checks were successful
ci/woodpecker/tag/release Pipeline was successful
feat: add background download service with error handling improvements
Add Android foreground service support for downloads to prevent OS
process killing during long operations. Fix multiple error handling
issues: foreground service leak on exceptions, polling stuck forever
on failure, double-counting chapters on retry, silent retry failures
without user feedback, and app crash if background service init fails.
Replace inaccurate failed chapter count heuristic with actual data.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 11:44:37 +01:00

60 lines
1.9 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:worldhopper/l10n/app_localizations.dart';
import 'package:worldhopper/config/router.dart';
import 'package:worldhopper/config/theme.dart';
import 'package:worldhopper/config/constants.dart';
import 'package:worldhopper/providers/theme_provider.dart';
import 'package:worldhopper/providers/locale_provider.dart';
import 'package:worldhopper/providers/download_provider.dart';
/// Root application widget
class App extends ConsumerStatefulWidget {
const App({super.key});
@override
ConsumerState<App> createState() => _AppState();
}
class _AppState extends ConsumerState<App> {
@override
void initState() {
super.initState();
_checkIncompleteDownloads();
}
Future<void> _checkIncompleteDownloads() async {
try {
final hasActive = await ref.read(hasActiveDownloadsProvider.future);
if (hasActive) {
ref.read(downloadPollingActiveProvider.notifier).state = true;
}
} catch (e) {
debugPrint('Failed to check incomplete downloads: $e');
}
}
@override
Widget build(BuildContext context) {
final themeMode = ref.watch(themeNotifierProvider);
final locale = ref.watch(localeNotifierProvider);
return MaterialApp.router(
title: AppConstants.appName,
theme: AppTheme.lightTheme,
darkTheme: AppTheme.darkTheme,
themeMode: themeMode,
locale: locale,
localizationsDelegates: const [
AppLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: AppLocalizations.supportedLocales,
routerConfig: AppRouter.router,
debugShowCheckedModeBanner: false,
);
}
}