fix(ui): bandeau de reprise de séance en cours (ticket #32)
Ajoute/corrige le bandeau de reprise sur home_screen.dart, avec les ajustements de bootstrap applicatif nécessaires, et sa couverture de tests. flutter analyze propre, 45/45 tests verts, build APK debug validé. Ticket laissé en QA : validation manuelle sur APK par l'utilisateur avant clôture. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -1,7 +1,17 @@
|
||||
import '../infrastructure/local/local.dart';
|
||||
import 'application.dart';
|
||||
|
||||
final class AppBootstrap {
|
||||
abstract interface class AppDependencies {
|
||||
ExerciseUseCases get exerciseUseCases;
|
||||
MediaUseCases get mediaUseCases;
|
||||
ProgramUseCases get programUseCases;
|
||||
WorkoutTemplateUseCases get workoutTemplateUseCases;
|
||||
ActiveWorkoutSessionUseCases get activeWorkoutSessionUseCases;
|
||||
CloseWorkoutSessionUseCase get closeWorkoutSessionUseCase;
|
||||
WorkoutHistoryUseCases get workoutHistoryUseCases;
|
||||
}
|
||||
|
||||
final class AppBootstrap implements AppDependencies {
|
||||
AppBootstrap._({
|
||||
required this.database,
|
||||
required this.exerciseUseCases,
|
||||
|
||||
@ -23,6 +23,7 @@ final class _GameTimeAppState extends State<GameTimeApp> {
|
||||
theme: courtBlazerLightTheme(),
|
||||
darkTheme: courtBlazerDarkTheme(),
|
||||
themeMode: _themeMode,
|
||||
navigatorObservers: [homeRouteObserver],
|
||||
home: HomeScreen(
|
||||
bootstrap: widget.bootstrap,
|
||||
themeMode: _themeMode,
|
||||
|
||||
@ -9,6 +9,8 @@ import 'theme.dart';
|
||||
import 'workout_execution_screen.dart';
|
||||
import 'workout_template_screen.dart';
|
||||
|
||||
final homeRouteObserver = RouteObserver<ModalRoute<void>>();
|
||||
|
||||
final class HomeScreen extends StatefulWidget {
|
||||
const HomeScreen({
|
||||
required this.bootstrap,
|
||||
@ -17,7 +19,7 @@ final class HomeScreen extends StatefulWidget {
|
||||
super.key,
|
||||
});
|
||||
|
||||
final AppBootstrap bootstrap;
|
||||
final AppDependencies bootstrap;
|
||||
final ThemeMode themeMode;
|
||||
final ValueChanged<ThemeMode>? onThemeModeChanged;
|
||||
|
||||
@ -25,13 +27,40 @@ final class HomeScreen extends StatefulWidget {
|
||||
State<HomeScreen> createState() => _HomeScreenState();
|
||||
}
|
||||
|
||||
final class _HomeScreenState extends State<HomeScreen> {
|
||||
final class _HomeScreenState extends State<HomeScreen> with RouteAware {
|
||||
late Future<ActiveWorkoutSession?> _openSession;
|
||||
ModalRoute<void>? _route;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_openSession = widget.bootstrap.activeWorkoutSessionUseCases.findOpen();
|
||||
_openSession = _findOpenSession();
|
||||
}
|
||||
|
||||
@override
|
||||
void didChangeDependencies() {
|
||||
super.didChangeDependencies();
|
||||
final route = ModalRoute.of<void>(context);
|
||||
if (route == null || identical(route, _route)) {
|
||||
return;
|
||||
}
|
||||
final previousRoute = _route;
|
||||
if (previousRoute != null) {
|
||||
homeRouteObserver.unsubscribe(this);
|
||||
}
|
||||
_route = route;
|
||||
homeRouteObserver.subscribe(this, route);
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
homeRouteObserver.unsubscribe(this);
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
void didPopNext() {
|
||||
_reloadOpenSession();
|
||||
}
|
||||
|
||||
@override
|
||||
@ -163,8 +192,16 @@ final class _HomeScreenState extends State<HomeScreen> {
|
||||
),
|
||||
);
|
||||
if (!mounted) return;
|
||||
_reloadOpenSession();
|
||||
}
|
||||
|
||||
Future<ActiveWorkoutSession?> _findOpenSession() {
|
||||
return widget.bootstrap.activeWorkoutSessionUseCases.findOpen();
|
||||
}
|
||||
|
||||
void _reloadOpenSession() {
|
||||
setState(() {
|
||||
_openSession = widget.bootstrap.activeWorkoutSessionUseCases.findOpen();
|
||||
_openSession = _findOpenSession();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user