Riverpod 3 pausiert Provider ohne Zuhörer; beim Router-Wechsel Login → Heute wurde die veraltete Kette mitten im Widget-Build wiederbelebt und löste die Warnung weiter aus. checklistWarmupProvider hält die Kette aus app.dart heraus aktiv, damit sie beim Screen-Mount schon frisch ist. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
61 lines
2.4 KiB
Dart
61 lines
2.4 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
|
|
import 'core/router/app_router.dart';
|
|
import 'core/settings/settings_provider.dart';
|
|
import 'core/theme/app_theme.dart';
|
|
import 'features/auth/presentation/bootstrap_gate.dart';
|
|
import 'features/household/data/household_providers.dart';
|
|
import 'features/notifications/data/push_registration_service.dart';
|
|
import 'features/today/application/due_tasks_provider.dart';
|
|
import 'l10n/generated/app_localizations.dart';
|
|
|
|
class LeafItToMeApp extends ConsumerWidget {
|
|
const LeafItToMeApp({super.key});
|
|
|
|
@override
|
|
Widget build(BuildContext context, WidgetRef ref) {
|
|
final settings = ref.watch(settingsProvider);
|
|
final router = ref.watch(appRouterProvider);
|
|
|
|
// Hält die Push-Registrierung aktiv: registriert das Gerät, sobald ein
|
|
// Nutzer angemeldet ist (auch wenn der Login vor dem App-Start bestand).
|
|
ref.watch(pushSetupProvider);
|
|
|
|
// Trägt die eigene E-Mail in Alt-Haushalten nach (Besitzer-Anzeige).
|
|
ref.watch(memberEntrySyncProvider);
|
|
|
|
// Hält die Checklisten-Provider aktiv (verhindert „markNeedsBuild
|
|
// during build" beim Einhängen der Heute-Ansicht nach dem Login).
|
|
ref.watch(checklistWarmupProvider);
|
|
|
|
return MaterialApp.router(
|
|
routerConfig: router,
|
|
onGenerateTitle: (context) => AppLocalizations.of(context).appTitle,
|
|
theme: buildAppTheme(
|
|
brightness: Brightness.light,
|
|
highContrast: settings.highContrast,
|
|
),
|
|
darkTheme: buildAppTheme(
|
|
brightness: Brightness.dark,
|
|
highContrast: settings.highContrast,
|
|
),
|
|
themeMode: settings.themeMode,
|
|
localizationsDelegates: AppLocalizations.localizationsDelegates,
|
|
supportedLocales: AppLocalizations.supportedLocales,
|
|
builder: (context, child) {
|
|
// App-Schriftgröße wird ZUSÄTZLICH zur System-Schriftgröße angewendet,
|
|
// damit die Systemeinstellung des Nutzers respektiert bleibt.
|
|
final systemScale = MediaQuery.textScalerOf(context).scale(1.0);
|
|
return MediaQuery(
|
|
data: MediaQuery.of(context).copyWith(
|
|
textScaler: TextScaler.linear(systemScale * settings.textSize.factor),
|
|
),
|
|
// Lässt frisch angemeldete Nutzer erst in die App, wenn Profil +
|
|
// Haushalt existieren (legt beides bei Bedarf an).
|
|
child: BootstrapGate(child: child!),
|
|
);
|
|
},
|
|
);
|
|
}
|
|
}
|