Basic layout, navigation, first empty pages

This commit is contained in:
2025-10-19 16:01:45 +02:00
parent 5c321c44df
commit cb6d34f93a
6 changed files with 161 additions and 5 deletions

View File

@@ -1,4 +1,24 @@
import 'package:flutter/material.dart';
import 'package:pacelab/screens/calendar_screen.dart';
import 'package:pacelab/screens/competitions_screen.dart';
import 'package:pacelab/screens/dashboard_screen.dart';
import 'package:pacelab/screens/events_screen.dart';
import 'package:pacelab/screens/season_screen.dart';
class Destination {
const Destination(this.label, this.icon);
final String label;
final IconData icon;
}
const List<Destination> destinations = [
Destination('Dashboard', Icons.dashboard),
Destination('Season', Icons.event),
Destination('Calendar', Icons.calendar_month),
Destination('Competitions', Icons.flag),
Destination('Events', Icons.edit_calendar_rounded),
];
void main() {
runApp(const MainApp());
@@ -9,12 +29,93 @@ class MainApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return const MaterialApp(
home: Scaffold(
body: Center(
child: Text('Hello World!'),
),
return MaterialApp(title: "PaceLab", home: PaceLabLayout(), theme: ThemeData.dark());
}
}
class PaceLabLayout extends StatefulWidget {
const PaceLabLayout({super.key});
@override
State<PaceLabLayout> createState() => _PaceLabLayoutState();
}
class _PaceLabLayoutState extends State<PaceLabLayout> {
int selectedIndex = 0;
void _onItemTapped(int index) {
setState(() {
selectedIndex = index;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("PaceLab"), backgroundColor: Colors.red.shade900),
body: Row(
children: [
navDrawer(),
Navigator(
key: ValueKey(selectedIndex),
onGenerateRoute: (settings) {
Widget page = const DashboardScreen();
switch (selectedIndex) {
case 0:
{
page = const DashboardScreen();
break;
}
case 1:
{
page = SeasonScreen();
break;
}
case 2:
{
page = CalendarScreen();
break;
}
case 3:
{
page = CompetitionsScreen();
break;
}
case 4:
{
page = EventsScreen();
break;
}
}
return MaterialPageRoute(builder: (_) => page);
},
),
],
),
);
}
NavigationDrawer navDrawer() {
return NavigationDrawer(
selectedIndex: selectedIndex,
onDestinationSelected: (value) => _onItemTapped(value),
indicatorColor: Colors.grey.shade700,
children: [
UserAccountsDrawerHeader(
decoration: BoxDecoration(color: Colors.redAccent),
accountName: Text("User name"), // todo
accountEmail: Text("VDOT: 48"), // todo
currentAccountPicture: FlutterLogo(), // todo
),
...destinations.map((Destination destination) {
return NavigationDrawerDestination(
icon: Icon(destination.icon),
label: Text(destination.label),
);
}),
],
);
}
}

View File

@@ -0,0 +1,10 @@
import 'package:flutter/material.dart';
class CalendarScreen extends StatelessWidget {
const CalendarScreen({super.key});
@override
Widget build(BuildContext context) {
return const Text("Calendar");
}
}

View File

@@ -0,0 +1,10 @@
import 'package:flutter/material.dart';
class CompetitionsScreen extends StatelessWidget {
const CompetitionsScreen({super.key});
@override
Widget build(BuildContext context) {
return Text("Competitions");
}
}

View File

@@ -0,0 +1,15 @@
import 'package:flutter/material.dart';
class DashboardScreen extends StatefulWidget {
const DashboardScreen({super.key});
@override
State<DashboardScreen> createState() => _DashboardScreenState();
}
class _DashboardScreenState extends State<DashboardScreen> {
@override
Widget build(BuildContext context) {
return const Text("Dashboard");
}
}

View File

@@ -0,0 +1,10 @@
import 'package:flutter/material.dart';
class EventsScreen extends StatelessWidget {
const EventsScreen({super.key});
@override
Widget build(BuildContext context) {
return Text("Events");
}
}

View File

@@ -0,0 +1,10 @@
import 'package:flutter/material.dart';
class SeasonScreen extends StatelessWidget {
const SeasonScreen({super.key});
@override
Widget build(BuildContext context) {
return Text("Season");
}
}