// Flutter import 'package:flutter/material.dart'; import '/models/item_type.dart'; import 'dart:io'; // Local import '/pages/tracked_item.dart'; import '/pages/report.dart'; import '/pages/settings.dart'; import '/pages/help.dart'; import '/db.dart'; class HomePage extends StatefulWidget { const HomePage({ super.key, }); @override State createState() => _HomePageState(); } class _HomePageState extends State { var pageSelected = 0; refresh() { setState(() {}); } @override Widget build(BuildContext context) { Widget page; Widget? dialog; switch (pageSelected) { case 0: page = TrackedItemPage( assetsToLoad: DatabaseHelper.instance.getExpenses(), notifyParent: refresh, ); dialog = TrackedItemInputDialog( notifyParent: refresh, type: ItemType.expense, ); break; case 1: page = TrackedItemPage( assetsToLoad: DatabaseHelper.instance.getIncomes(), notifyParent: refresh, ); dialog = TrackedItemInputDialog( notifyParent: refresh, type: ItemType.income, ); break; case 2: page = TrackedItemPage( assetsToLoad: DatabaseHelper.instance.getAssets(), notifyParent: refresh, ); dialog = TrackedItemInputDialog( notifyParent: refresh, type: ItemType.asset, ); break; case 3: page = ProjectionPage(); break; case 4: page = SettingsPage(); break; case 5: page = HelpPage(); break; default: throw UnimplementedError('No widget for page $pageSelected yet!'); } Future addNewValue(BuildContext context) { return showDialog( context: context, builder: (_) => AlertDialog(content: dialog), ); } Widget? floatingButton; if (dialog != null) { floatingButton = IconButton( onPressed: () { addNewValue(context); }, icon: Icon(Icons.add), color: Theme.of(context).colorScheme.onSurface, ); } Widget navigation = NavigationRail( extended: true, 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('Reports'), ), NavigationRailDestination( icon: Icon(Icons.settings), label: Text('Settings'), ), NavigationRailDestination( icon: Icon(Icons.help), label: Text('Help'), ), ], selectedIndex: pageSelected, onDestinationSelected: (value) { setState(() { pageSelected = value; if (Platform.isAndroid || Platform.isIOS) { Navigator.pop(context); } }); }, ); Widget main = Container( color: Theme.of(context).colorScheme.primaryContainer, child: Center(child: page), ); Widget? drawer; Widget body; if (Platform.isAndroid || Platform.isIOS) { drawer = navigation; body = SafeArea(child: main); } else { drawer = null; body = Row( children: [ SafeArea(child: navigation), Expanded(child: main), ], ); } return LayoutBuilder(builder: (context, constraints) { return Scaffold( appBar: AppBar( title: Text("Expense Tracker"), ), drawer: drawer, body: body, floatingActionButton: floatingButton, extendBody: false, extendBodyBehindAppBar: false, resizeToAvoidBottomInset: true, ); }); } }