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:
@@ -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(),
|
||||
];
|
||||
|
||||
|
||||
Reference in New Issue
Block a user