fix: clear season flow when starting Classic so tutorial/theme can't leak

- Add SeasonFlowNotifier.clear() to null out the flow state
- Call clear() in HomeScreen's Classic button before startStage()
- Broaden tutorial-end guard to next.phase != GamePhase.playing (covers stuck)
- Add regression test: clear() resets flow to null

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-12 07:33:41 +09:00
parent 26adf98d73
commit bf7720ebd3
4 changed files with 22 additions and 1 deletions
+4
View File
@@ -41,4 +41,8 @@ class SeasonFlowNotifier extends Notifier<SeasonFlow?> {
if (flow == null || !flow.hasNext) return;
startSeasonStage(flow.pack, flow.index + 1);
}
/// Leaving season play (e.g. starting a Classic run) clears the flow so
/// stale stage context can't leak into other modes.
void clear() => state = null;
}
+1 -1
View File
@@ -150,7 +150,7 @@ class _GameScreenState extends ConsumerState<GameScreen>
if (prev?.phase != next.phase) {
// A finished stage ends the tutorial; otherwise the overlay would sit
// on top of the result card and leak into the next stage.
if (next.phase == GamePhase.won || next.phase == GamePhase.lost) {
if (next.phase != GamePhase.playing) {
ref.read(tutorialProvider.notifier).skip();
}
if (next.phase == GamePhase.won) {
+1
View File
@@ -84,6 +84,7 @@ class HomeScreen extends ConsumerWidget {
),
onPressed: () {
if (!(ModalRoute.of(context)?.isCurrent ?? true)) return;
ref.read(seasonFlowProvider.notifier).clear();
ref.read(gameSessionProvider.notifier).startStage(
StageConfig.endless(
seed: DateTime.now().millisecondsSinceEpoch,