Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.build/
.buildlog/
.history
.svn/
.swiftpm/
migrate_working_dir/

# IntelliJ related
*.iml
*.ipr
*.iws
.idea/

# The .vscode folder contains launch configuration and tasks you configure in
# VS Code which you may wish to be included in version control, so this line
# is commented out by default.
#.vscode/

# Flutter/Dart/Pub related
**/doc/api/
**/ios/Flutter/.last_build_id
.dart_tool/
.flutter-plugins
.flutter-plugins-dependencies
.pub-cache/
.pub/
/build/

# Symbolication related
app.*.symbols

# Obfuscation related
app.*.map.json

# Android Studio will place build artifacts here
/android/app/debug
/android/app/profile
/android/app/release
45 changes: 45 additions & 0 deletions .metadata
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled and should not be manually edited.

version:
revision: "be698c48a6750c8cb8e61c740ca9991bb947aba2"
channel: "stable"

project_type: app

# Tracks metadata for the flutter migrate command
migration:
platforms:
- platform: root
create_revision: be698c48a6750c8cb8e61c740ca9991bb947aba2
base_revision: be698c48a6750c8cb8e61c740ca9991bb947aba2
- platform: android
create_revision: be698c48a6750c8cb8e61c740ca9991bb947aba2
base_revision: be698c48a6750c8cb8e61c740ca9991bb947aba2
- platform: ios
create_revision: be698c48a6750c8cb8e61c740ca9991bb947aba2
base_revision: be698c48a6750c8cb8e61c740ca9991bb947aba2
- platform: linux
create_revision: be698c48a6750c8cb8e61c740ca9991bb947aba2
base_revision: be698c48a6750c8cb8e61c740ca9991bb947aba2
- platform: macos
create_revision: be698c48a6750c8cb8e61c740ca9991bb947aba2
base_revision: be698c48a6750c8cb8e61c740ca9991bb947aba2
- platform: web
create_revision: be698c48a6750c8cb8e61c740ca9991bb947aba2
base_revision: be698c48a6750c8cb8e61c740ca9991bb947aba2
- platform: windows
create_revision: be698c48a6750c8cb8e61c740ca9991bb947aba2
base_revision: be698c48a6750c8cb8e61c740ca9991bb947aba2

# User provided section

# List of Local paths (relative to this file) that should be
# ignored by the migrate tool.
#
# Files that are not part of the templates will be ignored by default.
unmanaged_files:
- 'lib/main.dart'
- 'ios/Runner.xcodeproj/project.pbxproj'
189 changes: 119 additions & 70 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,74 +1,123 @@
# Desafio para Flutter Developer na DoroTech
# Projeto

Este projeto Flutter foi desenvolvido como parte de um teste para uma vaga na empresa DoroTech. Ele foi executado utilizando o SDK do Flutter, seguindo as melhores práticas de desenvolvimento para aplicações multiplataforma e aplicando conceitos como SOLID para organização do código, MVVM (Model-View-ViewModel) para separação de responsabilidades e Atomic Design para estruturação da interface de usuário.

# Conceitos de Programação e Arquitetura

Este projeto foi desenvolvido aplicando diversos conceitos e padrões de programação e arquitetura, visando a criação de um código limpo, testável, escalável e de fácil manutenção:

* **Programação Orientada a Objetos (POO)**: Utilização de classes, objetos, herança, polimorfismo e encapsulamento, pilares do desenvolvimento em Dart e Flutter.
* **Injeção de Dependências**: Implementada através da biblioteca `get_it`, facilitando a inversão de controle e a testabilidade das classes.
* **Tratamento de Erros Funcional**: Adoção da biblioteca `result_dart` para um tratamento explícito e robusto de resultados de operações (sucesso/falha), promovendo um fluxo de controle mais claro.
* **Arquitetura em Camadas / Clean Architecture (ou similar)**: A estrutura de diretórios (`config`, `data`, `design_system`, `domain`, `routing`, `shared`, `ui`) reflete uma clara separação de responsabilidades, isolando a lógica de negócio da interface do usuário e da infraestrutura.
* **SOLID Principles**: Os princípios SOLID (Single Responsibility, Open/Closed, Liskov Substitution, Interface Segregation, Dependency Inversion) foram aplicados para garantir um design de software flexível e manutenível.
* **MVVM (Model-View-ViewModel)**: Padrão de arquitetura utilizado para separar a lógica de negócio da interface do usuário, promovendo a testabilidade e a reutilização de código.
* **Atomic Design**: A organização dos componentes de UI na pasta `design_system` segue os princípios do Atomic Design, permitindo a construção de interfaces a partir de elementos menores e reutilizáveis (átomos, moléculas, organismos, templates e páginas).
* **Testes Unitários**: Com o uso de `flutter_test` e `mocktail`, o projeto incorpora testes automatizados para garantir a qualidade e o comportamento esperado das funcionalidades.
* **Navegação Declarativa**: Gerenciamento de rotas e navegação na aplicação de forma declarativa, utilizando a biblioteca `go_router`.
* **Consumo de API / Requisições HTTP**: A biblioteca `dio` é utilizada para realizar requisições de rede, facilitando a comunicação com serviços externos.
* **Logging**: Implementação de um sistema de logging com a biblioteca `logger` para auxiliar na depuração e monitoramento da aplicação.
* **Persistência de Dados Local**: Utilização de `shared_preferences` para o armazenamento simples e persistente de dados no dispositivo.

# Tecnologias

As seguintes tecnologias e bibliotecas foram utilizadas neste projeto:

* **Flutter SDK**: `3.8.0`
* [Documentação Oficial do Flutter](https://docs.flutter.dev/)
* **Motivo**: Framework principal para o desenvolvimento da aplicação multiplataforma.
* **Dart SDK**: Versão compatível com Flutter `3.8.0`
* [Documentação Oficial do Dart](https://dart.dev/guides)
* **Motivo**: Linguagem de programação utilizada pelo Flutter.

## Dependências

* **`get_it`**: `^8.0.3`
* [Pacote get_it](https://pub.dev/packages/get_it)
* **Motivo**: Utilizado para injeção de dependências, facilitando a organização e testabilidade do código.
* **`go_router`**: `^14.8.1`
* [Pacote go_router](https://pub.dev/packages/go_router)
* **Motivo**: Gerenciamento de rotas e navegação declarativa na aplicação.
* **`result_dart`**: `^2.0.0`
* [Pacote result_dart](https://pub.dev/packages/result_dart)
* **Motivo**: Implementa o padrão `Result` para tratamento de sucesso e falha em operações, promovendo um código mais robusto e legível.
* **`shared_preferences`**: `^2.5.3`
* [Pacote shared_preferences](https://pub.dev/packages/shared_preferences)
* **Motivo**: Permite o armazenamento simples de dados persistentes no dispositivo.
* **`dio`**: `^5.6.0`
* [Pacote dio](https://pub.dev/packages/dio)
* **Motivo**: Cliente HTTP poderoso para fazer requisições de rede.
* **`logger`**: `^2.6.0`
* [Pacote logger](https://pub.dev/packages/logger)
* **Motivo**: Biblioteca para logging de mensagens no console, útil para depuração.

## Dependências de Desenvolvimento

* **`flutter_lints`**: `^5.0.0`
* [Pacote flutter_lints](https://pub.dev/packages/flutter_lints)
* **Motivo**: Conjunto de regras de lint recomendadas para encorajar boas práticas de codificação.
* **`mocktail`**: `^1.0.3`
* [Pacote mocktail](https://pub.dev/packages/mocktail)
* **Motivo**: Biblioteca para criação de mocks em testes unitários e de integração.

# Emulador Utilizado para Testes

Para os testes e desenvolvimento desta aplicação, foi utilizado o seguinte emulador Android:

* **Modelo do Dispositivo**: Pixel 6 Pro
* **Resolução da Tela**: 1440 x 3120 pixels
* **Densidade da Tela (DPI)**: 560 dpi (xxxhdpi)
* **Versão do Android**: Android 14 (API Level 34)
* **Tamanho da Tela**: 6.7 polegadas

# Como Compilar e Rodar

Para compilar e rodar esta aplicação, siga os passos abaixo:

## Pré-requisitos

Certifique-se de ter o Flutter SDK instalado e configurado em sua máquina. Você pode verificar sua instalação executando:

Somos uma empresa com clientes que atuam em vários segmentos do mercado, com diferentes tecnologias, culturas e desafios.

Gostamos de compor nossos times com profissionais multidisciplinares, que tenham alta capacidade de aprendizado, sejam detalhistas, resilientes, questionadores e curiosos.
Você, como **Flutter Developer**, será o responsável por implementar, dar manutenção, aplicar correções e propor soluções em projetos de software.

## Orientações
Para executar o desafio de **Flutter Developer**, você **deverá utilizar framework Flutter e seguir suas boas práticas**, seguindo o [passo a passo](https://github.com/dorotech/flutter-test#etapas) para a execução, atendendo aos [critérios de aceitação](https://github.com/dorotech/flutter-test#critérios-de-aceitação).

## Desafio
Nossa equipe é apaixonada por **Rick and Morty**, o seu desafio será criar uma aplicação utilizando a API pública da série [https://rickandmortyapi.com/](https://rickandmortyapi.com/), para exibir a lista de personagens.
Veja a documentação [https://rickandmortyapi.com/documentation/#rest](https://rickandmortyapi.com/documentation/#rest).

Os requisitos da aplicação:

- Como usuário, desejo visualizar na página inicial, uma lista de 20 personagens incialmente, contendo **foto**, **nome** e **status**, com o tamanho da paginação sendo dinamica, podendo ser selecionando, 5, 10 ou 20 itens por vez.
- Como usuário, desejo clicar em um personagem da lista, para visualizar informações detalhadas. (seja criativo a api contem diversas informaçoes)
- Como usuário, desejo filtrar os personagens por **nome**, **gênero**, **espécie** e **status**, alguns filtros são enums, seja criativo.
- Como usuário, desejo combinar varios filtros.

## Etapas

#### 1 - Fazer um fork desse repositório

#### 2 - Criar um branch com o seu primeiro e último nome
```bash
git checkout -b joao-silva
flutter doctor
```

#### 3 - Escreva a documentação da sua aplicação
Você deve, substituir o conteúdo do arquivo **README.md** e escrever a documentação da sua aplicação, com os seguintes tópicos:
- **Projeto**: Descreva o projeto e como você o executou. Seja objetivo.
- **Tecnologias**: Descreva quais tecnologias foram utilizadas, enumerando versões (se necessário) e os links para suas documentações, quais bibliotecas instalou e porque.
- **Como compilar e rodar**: Descreva como compilar e rodar sua aplicação no Android e Web

#### 4 - Faça uma Pull Request
Após implementada a solução, crie uma [pull request](https://github.com/dorotech/flutter-test/pulls) com o seu projeto para esse repositório, avise o recrutador.

## Critérios de Aceitação
Para que seu teste tenha o mínimo necessário que atenda aos requisitos esperados, ele deve:
- Atender ao que foi proposto no [Desafio](https://github.com/dorotech/flutter-test#Desafio).
- Interfaces responsivas compatíveis com dispositivos Mobile e Web.
- Especificar qual dispositivo foi utilizado para testar a aplicação.
- Compatibilidade entre browsers.
- Uso de alguma arquitetura para o código. Ex: MVVM, BLoC.
- Utilizar padrões semânticos em mensagens de commit. (Gostamos do padrão de commits do repositório [AngularJS](http://karma-runner.github.io/3.0/dev/git-commit-msg.html))
- Caso você nao consiga completar tudo e tenha algum receio, não se preocupe, iremos avaliar o que foi entregue, mesmo com pendências.
- O diferencial para este desafio: layout, ux e ui, bem como implementação de boas práticas de segurança, performance e/ou estrutura.


## Dicas e Informações Valiosas

#### O que gostaríamos de ver em seu teste:
- Convenção de nome em classes, objetos, variáveis, métodos e etc.
- layout encantador
- Faça commits regulares. Eles são melhores do que um commit gigantesco. Gostaríamos de ver commits organizados e padronizados, então capriche neles!
- Animações, Sombras, Menus, componentes de Libs de UX implementados.
- **Bônus 1** Dark Mode, implementação sendo um botão que mude o padrão de cores da pagina para escuro e claro com 1 click ou que siga a configuração do dispositivo do cliente.
- **Bônus 2** Listagem de favoritos, com algum mecanismo de cache.
- **Bônus 3** Outros filtros além dos sugeridos na descrição inicial
- **Bônus 4** Testes automatizados

**Observação:** Nenhum dos itens acima é obrigatório.

#### O que o seu Teste não deve ter:
- Saber que não foi você quem implementou o projeto.
- Varias bibliotecas instaladas sem uso.
- Falta de organização de código.
- Falta de documentação.
- Nome de variáveis sem sentido ou sem padrão de nomes.
- Histórico de commits desorganizado e despadronizado.

## Boa Sorte!!
## Configuração Inicial

1. **Clone o repositório:**
```bash
git clone https://github.com/AlisonMeneses/flutter-test.git
cd flutter-test
```
2. **Instale as dependências:**
```bash
flutter pub get
```

## Rodar no Android

1. **Conecte um dispositivo Android** (físico ou emulador) e certifique-se de que ele seja reconhecido pelo Flutter.
```bash
flutter devices
```
2. **Execute a aplicação:**
```bash
flutter run
```
Isso compilará e instalará a aplicação no dispositivo Android conectado.

## Rodar na Web

1. **Habilite o suporte web** (se ainda não o fez):
```bash
flutter config --enable-web
```
2. **Execute a aplicação para web:**
```bash
flutter run -d chrome
```
Ou para um navegador específico:
```bash
flutter run -d web-server
```
Isso iniciará um servidor web local e abrirá a aplicação no seu navegador padrão.
28 changes: 28 additions & 0 deletions analysis_options.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# This file configures the analyzer, which statically analyzes Dart code to
# check for errors, warnings, and lints.
#
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
# invoked from the command line by running `flutter analyze`.

# The following line activates a set of recommended lints for Flutter apps,
# packages, and plugins designed to encourage good coding practices.
include: package:flutter_lints/flutter.yaml

linter:
# The lint rules applied to this project can be customized in the
# section below to disable rules from the `package:flutter_lints/flutter.yaml`
# included above or to enable additional rules. A list of all available lints
# and their documentation is published at https://dart.dev/lints.
#
# Instead of disabling a lint rule for the entire project in the
# section below, it can also be suppressed for a single line of code
# or a specific dart file by using the `// ignore: name_of_lint` and
# `// ignore_for_file: name_of_lint` syntax on the line or in the file
# producing the lint.
rules:
# avoid_print: false # Uncomment to disable the `avoid_print` rule
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule

# Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options
14 changes: 14 additions & 0 deletions android/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
gradle-wrapper.jar
/.gradle
/captures/
/gradlew
/gradlew.bat
/local.properties
GeneratedPluginRegistrant.java
.cxx/

# Remember to never publicly share your keystore.
# See https://flutter.dev/to/reference-keystore
key.properties
**/*.keystore
**/*.jks
44 changes: 44 additions & 0 deletions android/app/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
plugins {
id("com.android.application")
id("kotlin-android")
// The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
id("dev.flutter.flutter-gradle-plugin")
}

android {
namespace = "com.example.doro_tech"
compileSdk = flutter.compileSdkVersion
ndkVersion = flutter.ndkVersion

compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}

kotlinOptions {
jvmTarget = JavaVersion.VERSION_11.toString()
}

defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId = "com.example.doro_tech"
// You can update the following values to match your application needs.
// For more information, see: https://flutter.dev/to/review-gradle-config.
minSdk = flutter.minSdkVersion
targetSdk = flutter.targetSdkVersion
versionCode = flutter.versionCode
versionName = flutter.versionName
}

buildTypes {
release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
signingConfig = signingConfigs.getByName("debug")
}
}
}

flutter {
source = "../.."
}
7 changes: 7 additions & 0 deletions android/app/src/debug/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- The INTERNET permission is required for development. Specifically,
the Flutter tool needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>
Loading