Projects
Explore my portfolio of projects across different technologies.
A Flutter quiz application that integrates with external APIs to provide dynamic trivia questions across multiple categories. This project explores API integration, HTTP requests, and advanced state management using Riverpod while creating an engaging quiz experience.

A Flutter quiz application that fetches trivia questions from external APIs, offering users customizable quiz experiences across different categories and difficulty levels. This project focused on API integration and state management while building an interactive trivia game.
Trivioso provides a dynamic quiz experience by connecting to external trivia APIs rather than using static question sets. The app allows users to select categories, difficulty levels, and question quantities, then fetches appropriate questions in real-time. This approach ensures fresh content while exploring API integration patterns in Flutter.
Dynamic Question Fetching: Questions are retrieved from external APIs based on user preferences, ensuring varied content across quiz sessions without requiring content updates to the app itself.
Category Selection: The app fetches available quiz categories directly from the API rather than hardcoding them, allowing the question pool to expand automatically as the API adds new categories.
Customizable Quiz Parameters: Users can specify difficulty levels, number of questions, and categories before starting a quiz, creating tailored experiences for different skill levels and time constraints.
Real-Time Data Management: Implemented proper loading states, error handling, and data caching to manage the asynchronous nature of API-dependent content.
API Integration: Utilized the Dio package for HTTP requests, handling both question retrieval and category fetching with proper error management and response parsing.
State Management: Built with Riverpod for managing complex application state, including API responses, quiz progress, user selections, and loading states across multiple screens.
Asynchronous Operations: Implemented proper handling of network requests, loading indicators, and error states to create a smooth user experience despite external dependencies.
Data Modeling: Created structured data models for questions, categories, and quiz configurations to ensure type safety and maintainable code.
This project emerged from wanting to create a quiz app that wouldn't become stale with repeated use. By integrating with external APIs, I could provide virtually unlimited question variety without manually curating content.
The decision to fetch categories dynamically rather than hardcoding them was driven by the desire to build a truly flexible system. This approach meant the app could automatically benefit from API updates without requiring app modifications.
I focused on creating robust error handling since network-dependent apps need to gracefully manage connection issues, API changes, and unexpected responses. This led to implementing comprehensive loading states and fallback mechanisms.
Network Reliability: Managing the app's behavior when API requests fail or take longer than expected, implementing appropriate user feedback and retry mechanisms.
State Complexity: Coordinating multiple pieces of state (selected categories, quiz progress, fetched questions, user answers) while maintaining clean separation of concerns.
Data Consistency: Ensuring quiz data remains consistent throughout a session while handling potential API response variations.
The app architecture separates API services, state management, and UI components for maintainability and testability. Riverpod providers handle API calls and state distribution, while individual screens focus purely on presentation logic.
Error boundaries and loading states are implemented at the provider level, ensuring consistent behavior across different parts of the app when dealing with network operations.
This project provided practical experience with several important Flutter concepts:
The development process reinforced the importance of designing for network dependency from the ground up, as retrofitting robust error handling and loading states is significantly more complex than building them in initially.