Skip to content

luishperna/good-hamburger-flutter

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

51 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

logo


📱 Acabou de sair da "chapa", o seu novo app de pedidos de lanches irresistíveis 🍔

Good.Hamburger.App.-.Demonstration.of.Use.mp4

Escolher o seu pedido nunca foi tão fácil e moderno como agora!
Peça já e veja os descontos especiais que preparamos para você = )


Documentação

📑 Sumário


🎯 Objetivo

O Good Hamburger foi desenvolvido para oferecer uma experiência completa de pedidos de sanduíches e acompanhamentos. O aplicativo simula um ambiente real de produção, abrangendo desde o primeiro acesso do usuário até a finalização do pedido.

Principais Funcionalidades:

  • Onboarding & Identificação: Fluxo de integração e registro simplificado.
  • Navegação: Splash screen, menu interativo, carrinho de compras e histórico de pedidos.

Destaques Técnicos: O projeto foi construído com foco em escalabilidade e qualidade de código, utilizando arquitetura limpa. A estrutura segue as melhores práticas do mercado atual, incluindo a implementação de testes automatizados e um design de software moderno.


📐 Arquitetura

Para a arquitetura do projeto, foi utilizado o padrão MVVM (Model-View-ViewModel) conforme recomendação da documentação oficial do Flutter, ilustrado abaixo:

mvvm

📁 Estrutura (Feature-First)

A organização das pastas segue a separação por funcionalidades:

assets/                          # Arquivos estáticos
├── images/
└── mocks/                       # Mocks da API (JSON) e dados para testes

docs/                            # Documentos base para início do desenvolvimento
├── architecture/
└── designs/ 

lib/
├── core/                        # Configurações globais e infraestrutura
│   ├── config/
│   ├── di/              
│   ├── router/
│   └── ui/              
│
├── features/                    # Recursos/funcionalidades específicas 
│   ├── cart/                  
│   ├── main/                    # Responsável pela navegação principal
│   ├── menu/
│   ├── onboarding/
│   ├── orders/
│   ├── splash/            
│   └── user/                  
│
├── shared/                      # Recursos compartilhados/reutilizados em várias features
│   ├── domain/                
│   ├── models/               
│   ├── services/               
│   ├── utils/                  
│   └── view_models/            
│
└── main.dart                    # Ponto de início do aplicativo

test/                            # Testes automatizados
└── unit/ 

👨‍💻 Tecnologias e Ferramentas

  • Core

    • Framework: Flutter
    • Linguagem de programação: Dart
  • Ferramentas de Desenvolvimento

    • IDE: Android Studio
    • Versionamento: Git & GitHub
    • Qualidade de Código (Linter): flutter_lints
  • Arquitetura & Gerenciamento

    • Gerenciamento de Estado: Provider
    • Gerenciamento de Injeção de Dependência: GetIt
  • Persistência de Dados

    • Armazenamento Local: shared_preferences
    • Acesso ao Sistema de Arquivos: path_provider
  • Interface de Usuário (UI/UX)

    • Carrossel / Indicadores: smooth_page_indicator
    • Notificações In-App: top_snackbar_flutter
    • Ícones: cupertino_icons
  • Utilitários

    • Formatação (Moedas/Datas): intl

💻 Como rodar

Pré-requisitos

  • Dispositivo conectado à internet;
  • Flutter SDK instalado e configurado;
  • Android Studio (ou VS Code) configurado.

Instalação

  1. Siga as orientações de instalação do Flutter;
  2. Clone o repositório para a sua máquina ou realize o download do zip;
  3. No terminal, na raiz do projeto, execute:
flutter pub get

Execução

Para rodar o aplicativo, execute:

flutter run

Testes Unitários

Execute o seguinte comando para rodar os testes (cobertura de cenários de desconto):

flutter test test/unit/order_calculator_test.dart

🎲 Mocks (Dados Simulados)

Durante o desenvolvimento, foram utilizados arquivos mocks (localizados em assets/mocks) para simular a comunicação com uma API.

Clique para ver o JSON de MENU
[
  {
    "id": 1,
    "category": "sandwich",
    "name": "Burger",
    "description": "A classic, juicy beef burger served on a fresh bun.",
    "price": 500,
    "imagePath": "assets/mocks/images/menu/item_1.jpg"
  },
  {
    "id": 2,
    "category": "sandwich",
    "name": "Egg",
    "description": "A hearty sandwich featuring fresh eggs and tasty toppings.",
    "price": 450,
    "imagePath": "assets/mocks/images/menu/item_2.jpg"
  },
  {
    "id": 3,
    "category": "sandwich",
    "name": "Bacon",
    "description": "A savory sandwich piled high with crispy bacon and cheese.",
    "price": 700,
    "imagePath": "assets/mocks/images/menu/item_3.jpg"
  },
  {
    "id": 4,
    "category": "fries",
    "name": "Fries",
    "description": "Crispy golden french fries, perfect as a side.",
    "price": 200,
    "imagePath": "assets/mocks/images/menu/item_4.jpg"
  },
  {
    "id": 5,
    "category": "drink",
    "name": "Soft Drink",
    "description": "A refreshing, ice-cold soft drink to complete your meal.",
    "price": 250,
    "imagePath": "assets/mocks/images/menu/item_5.jpg"
  }
]
Clique para ver o JSON de PEDIDOS
[
  {
    "id": 1,
    "code": "2345",
    "date": "2025-11-21T23:33:40.123Z",
    "items": [
      {
        "id": 1,
        "category": "sandwich",
        "name": "Burger",
        "description": "A classic, juicy beef burger served on a fresh bun.",
        "price": 500,
        "imagePath": "assets/mocks/images/menu/item_1.jpg"
      }
    ],
    "subtotal": 500,
    "discount": 0,
    "total": 500,
    "status": "preparing",
    "orderedBy": {
      "name": "Luís"
    }
  },
  {
    "id": 2,
    "code": "2346",
    "date": "2025-11-21T23:33:40.123Z",
    "items": [
      {
        "id": 1,
        "category": "sandwich",
        "name": "Burger",
        "description": "A classic, juicy beef burger served on a fresh bun.",
        "price": 500,
        "imagePath": "assets/mocks/images/menu/item_1.jpg"
      },
      {
        "id": 4,
        "category": "fries",
        "name": "Fries",
        "description": "Crispy golden french fries, perfect as a side.",
        "price": 200,
        "imagePath": "assets/mocks/images/menu/item_4.jpg"
      }
    ],
    "subtotal": 700,
    "discount": 70,
    "total": 630,
    "status": "delivered",
    "orderedBy": {
      "name": "Perna"
    }
  }
]

🚧 Limitações e Próximos Passos

  • Rotas tipadas: migrar para um roteador com tipagem (ex: GoRouter) para segurança na injeção de argumentos.
  • API real: trocar ApiService simulado por uma http para integração com backend e ajustas camadas adaptadas durante a simulação.
  • Testes de Integração: adicionar testes end-to-end para fluxo do carrinho (adicionar item → verificar total → enviar pedido).

📝 Autor


Luís Henrique Perna

About

🍔 A good burger ordering app made in Flutter | Practical Test 🍟

Topics

Resources

Stars

Watchers

Forks

Languages