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:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -77,4 +77,20 @@ void main() {
|
||||
expect(container.read(seasonFlowProvider)!.hasNext, isFalse);
|
||||
expect(container.read(gameSessionProvider)!.phase, GamePhase.playing);
|
||||
});
|
||||
|
||||
test('clear() resets flow to null so Classic mode has no stale season context',
|
||||
() async {
|
||||
final container = await _container();
|
||||
final flow = container.read(seasonFlowProvider.notifier);
|
||||
flow.startSeasonStage(_pack(), 0);
|
||||
|
||||
// State is non-null after starting a season stage.
|
||||
expect(container.read(seasonFlowProvider), isNotNull);
|
||||
|
||||
flow.clear();
|
||||
|
||||
// After clear(), the flow must be null so GameScreen's tutorial/theme
|
||||
// checks can't fire for a Classic (endless) session.
|
||||
expect(container.read(seasonFlowProvider), isNull);
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user