← Back to projects
Project

Parksmart app

Parksmart app

ParkSmart is a fully functional mobile parking application built with Flutter and Dart as a final project. The app provides a complete end-to-end parking management experience, from finding and saving a parking spot to tracking a session and calculating the total parking cost.

Architecture & Technical Design

The app is built around a clean, service-based architecture. All Firebase interactions are handled through a singleton FirebaseService class, which acts as the central data layer for authentication, session management, and Firestore operations. The data models ParkingSession, SavedParking, and UserProfile are strongly typed Dart classes with built-in Firestore serialization and deserialization.

The UI is built with a custom design system defined in AppTheme, supporting both light and dark mode based on the device's system settings. Reusable components such as PsButton, PsCard, PsScreenHeader, and PsSnackbar ensure a consistent look and feel across all screens.

Authentication

Users can register with their name, email address, license plate, and password. Firebase Authentication handles secure login and session management. Upon registration, a user profile is stored in Cloud Firestore under a dedicated Users collection, linking all parking data to the authenticated user.

Home Screen & Session Management

The home screen displays the user's current active parking session in real time using a Firestore stream. When a session is active, the user can see the start time, zone, and a live duration counter. Sessions can be stopped directly from the home screen, after which they are marked as done with a stop timestamp.

Map Screen

The map screen uses Mapbox Maps Flutter combined with the Geolocator package to display the user's real-time location. When a saved parking location exists, the map calculates and displays a route from the current position to the saved spot. The map supports standard map interactions such as zooming and panning.

Save Parking Screen

Users can save their current parking location by entering the address, zone, and duration. This data is stored in Firestore and automatically creates a new active parking session, while any previously active session is expired to ensure only one session is active at a time.

Payment Screen (4411)

The payment screen simulates the Belgian 4411 parking payment system. It automatically fetches the active session and prefills the license plate and zone. Users can configure the hourly rate and daily maximum, and the app calculates the total cost in real time based on the actual parked duration (hourly rate × parked hours, capped at the daily maximum, plus a fixed service fee of €0.20). The payment is confirmed via a deep link that opens the 4411 app using url_launcher, and the session is saved to Firestore with the calculated cost.

Parking History

The history screen shows a chronological list of all past and active parking sessions. Each entry displays the location, zone, duration, cost, and license plate. Users can reactivate an expired session, which automatically expires any currently active session and restarts the selected one with a new start time. Sessions can also be permanently deleted from the history.

Technologies

Flutter (Dart)Firebase AuthenticationCloud Firestore Mapbox Maps FlutterGeolocatorurl_launcher