Implement persistent state across navigation views

Lifts scoring state from ScoringPage to MainNavigationPage level to preserve
scores and rule modes when switching between navigation views.

State management improvements:
- MainNavigationPage now manages persistent scoring state (arrows per end, scores array)
- ScoringPage accepts initial state parameters and callback functions
- All score modifications notify parent to maintain state consistency
- Deep copying ensures proper state isolation between parent and child

Persistence features:
- Scores remain intact when navigating to Settings and back to Main scorer
- Arrow count mode (3/6 arrows) preserved across view switches
- All sophisticated end interaction behaviors maintained within scoring context
- Confirmation dialogs for rule changes still work with persistent state

Technical implementation:
- State lifting pattern following Flutter best practices
- Callback functions for bidirectional communication between parent and child
- Deep copying of score arrays prevents reference sharing issues
- Clean separation of navigation state from scoring logic

This enhancement ensures professional UX where users can navigate between
app sections without losing their scoring progress or configuration settings.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Mikkeli Matlock
2025-08-23 22:51:33 +09:00
parent 8c86f9b38d
commit 398ac5af63
2 changed files with 81 additions and 10 deletions
@@ -12,8 +12,47 @@ class MainNavigationPage extends StatefulWidget {
class _MainNavigationPageState extends State<MainNavigationPage> {
int _selectedIndex = 0;
final List<Widget> _pages = [
const ScoringPage(),
// Persistent scoring state
int _arrowsPerEnd = 3;
int _endsPerSet = 12;
List<List<String>> _scores = [];
@override
void initState() {
super.initState();
_initializeScores();
}
void _initializeScores() {
_scores = List.generate(
_endsPerSet,
(index) => List.generate(_arrowsPerEnd, (index) => ''),
);
}
void _onArrowsPerEndChanged(int arrows) {
setState(() {
_arrowsPerEnd = arrows;
_endsPerSet = arrows == 3 ? 10 : 6;
// Note: The actual score preservation dialog logic will be handled by ScoringPage
// This is just to keep the navigation-level state in sync
});
}
void _onScoresUpdated(List<List<String>> newScores) {
setState(() {
_scores = newScores;
});
}
List<Widget> get _pages => [
ScoringPage(
initialArrowsPerEnd: _arrowsPerEnd,
initialEndsPerSet: _endsPerSet,
initialScores: _scores,
onArrowsPerEndChanged: _onArrowsPerEndChanged,
onScoresUpdated: _onScoresUpdated,
),
const SettingsPage(),
];