From 0c9b365f7fe6eee8e9e0ab2808185183e557729d Mon Sep 17 00:00:00 2001 From: Hyperling Date: Sat, 1 Feb 2025 03:42:14 -0700 Subject: [PATCH] Added navigation. Very nice!! ;D --- lib/main.dart | 103 +++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 89 insertions(+), 14 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 5656221..30772c5 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -13,21 +13,98 @@ class MainApp extends StatelessWidget { @override Widget build(BuildContext context) { - return MaterialApp( - title: 'Recurring Expense Tracker', - theme: ThemeData( - useMaterial3: true, - colorScheme: ColorScheme.fromSeed(seedColor: Colors.green), - ), - home: Scaffold( - body: ExpenseInputForm(), - //floatingActionButton: IconButton(onPressed: appState.newExpense(), icon: Icon(Icons.add)), + title: 'Recurring Expense Tracker', + theme: ThemeData( + useMaterial3: true, + colorScheme: ColorScheme.fromSeed(seedColor: Colors.green), ), + home: HomePage(), ); } } +class HomePage extends StatefulWidget { + const HomePage({ + super.key, + }); + + @override + State createState() => _HomePageState(); +} + +class _HomePageState extends State { + var pageSelected = 0; + + @override + Widget build(BuildContext context) { + Widget page; + switch (pageSelected) { + case 0: + page = ExpenseInputForm(); + case 1: + page = Placeholder(); + case 2: + page = Placeholder(); + case 3: + page = Placeholder(); + case 4: + page = Placeholder(); + default: + throw UnimplementedError('no widget for $pageSelected'); + } + + return LayoutBuilder(builder: (context, constraints) { + return Scaffold( + body: Row( + children: [ + SafeArea( + child: NavigationRail( + extended: constraints.maxWidth >= 600, + destinations: [ + NavigationRailDestination( + icon: Icon(Icons.payment), + label: Text('Expenses'), + ), + NavigationRailDestination( + icon: Icon(Icons.account_balance), + label: Text('Income'), + ), + NavigationRailDestination( + icon: Icon(Icons.attach_money), + label: Text('Liquid Assets'), + ), + NavigationRailDestination( + icon: Icon(Icons.bar_chart), + label: Text('Projections'), + ), + NavigationRailDestination( + icon: Icon(Icons.settings), + label: Text('Settings'), + ), + ], + selectedIndex: pageSelected, + onDestinationSelected: (value) { + setState(() { + pageSelected = value; + }); + }, + ), + ), + Expanded( + child: Container( + color: Theme.of(context).colorScheme.primaryContainer, + child: page, + ), + ), + ], + ), + //floatingActionButton: IconButton(onPressed: appState.newExpense(), icon: Icon(Icons.add)), + ); + }); + } +} + class ExpenseInputForm extends StatefulWidget { const ExpenseInputForm({ super.key, @@ -71,8 +148,8 @@ class _ExpenseInputFormState extends State { height: inputHeight, child: TextField( keyboardType: TextInputType.numberWithOptions(decimal: true), - decoration: InputDecoration( - labelText: "Cost", hintText: "Example: 10.00"), + decoration: + InputDecoration(labelText: "Cost", hintText: "Example: 10.00"), ), ), DropdownMenu( @@ -88,9 +165,7 @@ class _ExpenseInputFormState extends State { keyboardType: TextInputType.text, decoration: InputDecoration( labelText: "Description", - hintText: - "Example: 1GB data with unlimited talk & text." - ), + hintText: "Example: 1GB data with unlimited talk & text."), )), ]), );