A Flutter application for managing and resolving support tickets with a clean, modern interface using Material 3 design & clean architecture.
-
Login Screen (Mock Authentication)
- Email + password form with validation
- Fake authentication (accepts any non-empty email/password)
- Persistent login state using SharedPreferences
-
Tickets List
- Fetches tickets from
https://jsonplaceholder.typicode.com/posts - Displays tickets with modern card-based UI
- Pull-to-refresh functionality
- Real-time status updates (Open/Resolved)
- Loading and error states handling
- Fetches tickets from
-
Ticket Details Screen
- Full title and body display
- "Mark as Resolved" button
- Local persistence of resolved state
- Confirmation dialog before resolving
- Visual feedback for resolved tickets
-
Bottom Navigation
- Tickets: Main ticket list view
- Profile: User profile with logout functionality
-
Material 3 Theme
- Modern design system with dynamic color schemes
- Consistent theming across all screens
-
Dark Mode Support
- Automatic theme switching based on system preference
- Beautiful dark theme variants
-
Smooth Animations
- Page transitions
- Loading indicators
- Interactive feedback
-
Responsive UI
- Adapts to different screen sizes
- Touch-friendly interface
-
Custom Launcher Icon
- Created a fitting icon from (https://icon.kitchen)
- Android & iOS
The app follows Clean Architecture principles with clear separation of concerns:
lib/
├── core/ # Core functionality
│ ├── constants/ # App constants
│ ├── errors/ # Error handling
│ ├── navigation/ # GoRouter configuration
│ ├── network/ # API and local storage services
│ └── utils/ # Utility functions
├── features/ # Feature modules
│ ├── auth/ # Authentication feature
│ │ ├── data/ # Data layer (repositories, models, data sources)
│ │ ├── domain/ # Domain layer (entities, repositories, use cases)
│ │ └── presentation/ # Presentation layer (BLoC, pages, widgets)
│ ├── tickets/ # Tickets feature
│ └── profile/ # Profile feature
└── shared/ # Shared components
├── theme/ # App theming
└── widgets/ # Reusable widgets
- Flutter (Stable Channel)
- Dart
- BLoC/Cubit for state management
- SharedPreferences for local storage
- GoRouter for routing
- Clean Architecture folder structure
- Material 3 responsive UI
flutter_bloc- State managementequatable- Value equalityhttp- API requestsshared_preferences- Local storagego_router- Navigationjson_annotation&json_serializable- JSON serialization
- Flutter SDK (latest stable)
- Dart SDK
- Android Studio / VS Code
- Android/iOS emulator or physical device
-
Clone the repository
git clone https://github.com/ogaroh/ticketly cd ticketly -
Install dependencies
flutter pub get
-
Generate code
dart run build_runner build
-
Run the app
flutter run
- Use any email and password to login (mocked authentication)
- Example: email:
user@example.com, password:123456
- Browse tickets on the main screen
- Tap any ticket to view details
- Use "Mark as Resolved" to resolve tickets
- Pull down to refresh the list
- View logged-in user email
- Access logout functionality
- Future: Settings and help sections
- BLoC pattern for predictable state management
- Separation of business logic from UI
- Event-driven architecture
- Local storage for user authentication state
- Resolved tickets persist across app restarts
- Efficient data caching
- Material 3 design language
- Dark/Light theme support
- Responsive design for all screen sizes
- Loading states and error handling
- Pull-to-refresh functionality
- Confirmation dialogs for important actions
- Clean Architecture principles
- SOLID principles adherence
- Separation of concerns
- Testable code structure
- Type safety with Dart
The app includes unit tests for:
- BLoC state management
- Repository implementations
- Use cases
- Models
Run tests with:
flutter testflutter build apk --debugflutter build apk --releaseThe APK will be available in the build/app/outputs/flutter-apk/ folder
- Branding updates for uniqueness
- Real authentication with backend API
- Ticket creation functionality
- Push notifications for ticket updates
- Offline support with local database
- User settings and preferences
- Ticket search and filtering
- Analytics and reporting
© Erick Ogaro