- Custom Material 3 theme with Hot Wheels branding (orange/red gradient, navy accents) - Locally bundled Poppins font (Regular, Medium, SemiBold, Bold) - Redesigned login screen with full-bleed background image and frosted glass form - Bottom navigation shell: My Garage / Scan / Profile tabs - My Garage screen with grid view, search, stats, detail bottom sheet - Edit and delete car details from the detail sheet - Skip button for quick-add with minimal info - Camera photo upload to Supabase Storage (UUID-based unguessable paths) - Change/add photo from car detail view - Profile screen with change password, about dialog, sign out - Scan tab with camera scanner and manual entry - Styled scanner screen with crosshair overlay and gradient buttons - Custom app icon with transparent background and adaptive icon support - Native splash screen with brand colors - Auto-refresh garage on tab switch
62 lines
1.6 KiB
Dart
62 lines
1.6 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'garage_screen.dart';
|
|
import 'scan_tab.dart';
|
|
import 'profile_screen.dart';
|
|
|
|
/// Bottom-navigation shell that hosts the three main tabs.
|
|
class HomeShell extends StatefulWidget {
|
|
const HomeShell({super.key});
|
|
|
|
@override
|
|
State<HomeShell> createState() => _HomeShellState();
|
|
}
|
|
|
|
class _HomeShellState extends State<HomeShell> {
|
|
int _currentIndex = 0;
|
|
final _garageKey = GlobalKey<GarageScreenState>();
|
|
|
|
late final List<Widget> _pages = <Widget>[
|
|
GarageScreen(key: _garageKey),
|
|
const ScanTab(),
|
|
const ProfileScreen(),
|
|
];
|
|
|
|
void _onTabSelected(int i) {
|
|
setState(() => _currentIndex = i);
|
|
// Refresh garage whenever user switches to it.
|
|
if (i == 0) {
|
|
_garageKey.currentState?.refresh();
|
|
}
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Scaffold(
|
|
body: IndexedStack(
|
|
index: _currentIndex,
|
|
children: _pages,
|
|
),
|
|
bottomNavigationBar: NavigationBar(
|
|
selectedIndex: _currentIndex,
|
|
onDestinationSelected: _onTabSelected,
|
|
destinations: const [
|
|
NavigationDestination(
|
|
icon: Icon(Icons.garage_outlined),
|
|
selectedIcon: Icon(Icons.garage),
|
|
label: 'Garage',
|
|
),
|
|
NavigationDestination(
|
|
icon: Icon(Icons.qr_code_scanner_outlined),
|
|
selectedIcon: Icon(Icons.qr_code_scanner),
|
|
label: 'Scan',
|
|
),
|
|
NavigationDestination(
|
|
icon: Icon(Icons.person_outline),
|
|
selectedIcon: Icon(Icons.person),
|
|
label: 'Profile',
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|