Portfolio

πŸš€ Meu PortfΓ³lio - Flutter Web Experience

Tech Stack

Architecture State Management Backend Design Pattern

Um portfΓ³lio interativo e responsivo desenvolvido com Flutter Web, integrando Supabase como backend e demonstrando arquitetura profissional, UI/UX avanΓ§ada, animaΓ§Γ΅es complexas e gerenciamento de estado robusto.


🎨 Funcionalidades & Destaques

Este projeto vai alΓ©m de uma simples landing page estΓ‘tica. Ele implementa conceitos avanΓ§ados de renderizaΓ§Γ£o, interatividade e arquitetura:

🎯 Funcionalidades Principais

✨ UI/UX Avançada


πŸ› οΈ Stack TecnolΓ³gica

Core

Arquitetura & PadrΓ΅es

Bibliotecas Principais


πŸ“‚ Estrutura do Projeto (Clean Architecture)

O projeto segue uma estrutura Atomic Design misturada com Clean Architecture para garantir escalabilidade e manutenΓ§Γ£o:

lib/
β”œβ”€β”€ core/                  # ConfiguraΓ§Γ΅es globais (Temas, Constantes, Utils)
β”œβ”€β”€ data/                  # Camada de Dados
β”‚   β”œβ”€β”€ mocks/             # Dados estΓ‘ticos (CurrΓ­culo, Projetos)
β”‚   β”œβ”€β”€ models/            # Modelos de dados (ProjectModel, SkillModel)
β”‚   └── repositories/      # Contratos e ImplementaΓ§Γ΅es de RepositΓ³rio
β”œβ”€β”€ presentation/          # Camada de UI
β”‚   β”œβ”€β”€ controllers/       # LΓ³gica de Estado (PortfolioController)
β”‚   β”œβ”€β”€ pages/             # Telas principais (HomePage)
β”‚   └── widgets/           # Componentes Visuais (Atomic Design)
β”‚       β”œβ”€β”€ atoms/         # BotΓ΅es, Chips, Elementos MagnΓ©ticos
β”‚       β”œβ”€β”€ molecules/     # Cards Interativos (ProjectCard, ExperienceCard)
β”‚       └── organisms/     # SeΓ§Γ΅es completas (Hero, Skills, Projects)
└── main.dart              # Ponto de entrada e InjeΓ§Γ£o de DependΓͺncias

πŸ—οΈ Arquitetura do Projeto

PadrΓ£o Arquitetural: MVVM + Repository Pattern + Clean Architecture Elements

O projeto implementa uma arquitetura hΓ­brida robusta que combina os melhores aspectos de MVVM, Repository Pattern e Clean Architecture:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                        PRESENTATION LAYER                           β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”           β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”‚
β”‚  β”‚                β”‚  Provider β”‚                              β”‚     β”‚
β”‚  β”‚     VIEW       │◄─────────►│      VIEW MODEL              β”‚     β”‚
β”‚  β”‚   (Pages +     β”‚   Binding β”‚    (Controllers)             β”‚     β”‚
β”‚  β”‚    Widgets)    β”‚           β”‚                              β”‚     β”‚
β”‚  β”‚                β”‚           β”‚ β€’ PortfolioController        β”‚     β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜           β”‚ β€’ AuthController             β”‚     β”‚
β”‚   β€’ home_page.dart            β”‚                              β”‚     β”‚
β”‚   β€’ admin_dashboard_page.dart β”‚ State Management: Provider   β”‚     β”‚
β”‚   β€’ Atomic Design Components  β”‚ (ChangeNotifier Pattern)     β”‚     β”‚
β”‚                                β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                                β”‚
                                                β”‚ Dependency
                                                β”‚ Injection
                                                ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                          DATA LAYER                                 β”‚
β”‚                                                                     β”‚
β”‚   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”‚
β”‚   β”‚          Repository Interface (Contract)                β”‚     β”‚
β”‚   β”‚                                                         β”‚     β”‚
β”‚   β”‚      abstract class IPortfolioRepository {             β”‚     β”‚
β”‚   β”‚        Future<List<Project>> getProjects();            β”‚     β”‚
β”‚   β”‚        Future<void> addProject(Project project);       β”‚     β”‚
β”‚   β”‚      }                                                  β”‚     β”‚
β”‚   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β”‚
β”‚                           β”‚ implements                            β”‚
β”‚                           ↓                                       β”‚
β”‚   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”‚
β”‚   β”‚    Repository Implementation                            β”‚     β”‚
β”‚   β”‚                                                         β”‚     β”‚
β”‚   β”‚    class SupabaseRepository                            β”‚     β”‚
β”‚   β”‚    implements IPortfolioRepository {                   β”‚     β”‚
β”‚   β”‚                                                         β”‚     β”‚
β”‚   β”‚      β€’ getProjects()                                   β”‚     β”‚
β”‚   β”‚      β€’ getExperiences()                                β”‚     β”‚
β”‚   β”‚      β€’ getSkills()                                     β”‚     β”‚
β”‚   β”‚      β€’ getCertificates()                               β”‚     β”‚
β”‚   β”‚      β€’ CRUD Operations                                 β”‚     β”‚
β”‚   β”‚      β€’ Error Handling                                  β”‚     β”‚
β”‚   β”‚      β€’ Logging                                         β”‚     β”‚
β”‚   β”‚    }                                                    β”‚     β”‚
β”‚   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β”‚
β”‚                           β”‚                                       β”‚
β”‚                           ↓                                       β”‚
β”‚   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”‚
β”‚   β”‚              MODELS (Entities)                          β”‚     β”‚
β”‚   β”‚                                                         β”‚     β”‚
β”‚   β”‚   β€’ ProjectModel         β€’ SkillModel                  β”‚     β”‚
β”‚   β”‚   β€’ ExperienceModel      β€’ CertificateModel            β”‚     β”‚
β”‚   β”‚                                                         β”‚     β”‚
β”‚   β”‚   Responsibilities:                                    β”‚     β”‚
β”‚   β”‚   - Data structure definition                          β”‚     β”‚
β”‚   β”‚   - JSON serialization (toMap/fromMap)                 β”‚     β”‚
β”‚   β”‚   - Type validation                                    β”‚     β”‚
β”‚   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β”‚
β”‚                           β”‚                                       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                            β”‚
                            ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                      EXTERNAL DATA SOURCE                           β”‚
β”‚                                                                     β”‚
β”‚                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                          β”‚
β”‚                    β”‚     SUPABASE        β”‚                          β”‚
β”‚                    β”‚                     β”‚                          β”‚
β”‚                    β”‚  β€’ PostgreSQL DB    β”‚                          β”‚
β”‚                    β”‚  β€’ Auth System      β”‚                          β”‚
β”‚                    β”‚  β€’ Real-time Sync   β”‚                          β”‚
β”‚                    β”‚  β€’ Row Level Sec.   β”‚                          β”‚
β”‚                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Fluxo de Dados

USER INTERACTION
      ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   View (Widget)      β”‚  β†’ User taps button, enters text
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           β”‚
           ↓ Event (onPressed, onChange)
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   ViewModel          β”‚  β†’ Receives event, updates state
β”‚   (Controller)       β”‚  β†’ Calls repository methods
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           β”‚
           ↓ Method call
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Repository         β”‚  β†’ Handles data operations
β”‚   (Data Layer)       β”‚  β†’ Interacts with Supabase
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           β”‚
           ↓ HTTP/gRPC
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Supabase API       β”‚  β†’ Returns data
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           β”‚
           ↓ Response
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Repository         β”‚  β†’ Converts to Models
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           β”‚
           ↓ Models
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   ViewModel          β”‚  β†’ Updates state
β”‚   (Controller)       β”‚  β†’ notifyListeners()
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           β”‚
           ↓ State change
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   View (Widget)      β”‚  β†’ Rebuilds with new data
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

PrincΓ­pios Aplicados

βœ… SOLID Principles

βœ… Design Patterns

BenefΓ­cios da Arquitetura

BenefΓ­cio DescriΓ§Γ£o
πŸ§ͺ Testabilidade FΓ‘cil criar mocks para testes unitΓ‘rios
πŸ”§ Manutenibilidade MudanΓ§as isoladas nΓ£o afetam outras camadas
πŸ“ˆ Escalabilidade FΓ‘cil adicionar novas features sem quebrar cΓ³digo existente
πŸ”„ Reusabilidade Componentes podem ser reutilizados em diferentes contextos
πŸ‘₯ ColaboraΓ§Γ£o Estrutura clara facilita trabalho em equipe
πŸ› Debugging Fluxo de dados previsΓ­vel facilita identificaΓ§Γ£o de bugs

πŸš€ Como Rodar o Projeto

PrΓ©-requisitos

Certifique-se de ter o Flutter SDK instalado.

  1. Clone o repositΓ³rio:

    git clone [https://github.com/DevFullStack-Franklyn-R-Silva/meu_curriculo_flutter.git](https://github.com/DevFullStack-Franklyn-R-Silva/meu_curriculo_flutter.git)
    cd meu_curriculo_flutter
    
  2. Instale as dependΓͺncias:

    flutter pub get
    
  3. Rode no Chrome:

    flutter run -d chrome
    

πŸ“¦ Como Fazer o Deploy (GitHub Pages)

Para gerar a versΓ£o de produΓ§Γ£o e hospedar gratuitamente:

# Gere o build de web (substitua o href pelo nome do seu repositΓ³rio)
flutter build web --release --base-href "/meu_curriculo_flutter/"

# O conteΓΊdo gerado estarΓ‘ na pasta /build/web

πŸ‘¨β€πŸ’» Autor

Franklyn Roberto Mobile Developer (Flutter) & Fullstack


Desenvolvido com πŸ’™ e Flutter.