Buenas Prácticas Flutter: De una idea a un MVP 💡📲 — Parte II (Estructura)

Christian Llansola
3 min readDec 6, 2020

--

Hoy vamos a generar la estructura de carpetas del proyecto. Para ello vamos a basarnos en Domain Driven Design más conocido como DDD.

Antes de generar toda la estructura me gusta tener claro a rasgos genéricos qué posibles dependencias voy a usar.

Me ha gustado lo que he visto sobre GetX. Por eso quiero implementar la gestión de estados de toda la aplicación con GetX y aparcar a Provider por un tiempo.

De momento, la estructura final puede ser algo parecido a:

├── appController
├── data
│ └── datasource
├── domain
│ ├── exceptions
│ ├── models
│ ├── repositories
│ ├── requests
│ ├── responses
│ └── usecases
├── main.dart
├── presentation
│ ├── shared
│ └── splash
├── src
│ ├── config
│ │ └── styles.dart
│ └── routes
└── utils

📂 appController

Incluiremos los controladores globales de la aplicación y sus bindings.

📂 data

Todo lo relacionado con datos, tanto a nivel interno como externo.

📂 data > datasource

En esta carpeta incluiremos las implementaciones de los repositorios. Basicamente serán los archivos que interactuarán directamente con los datos en sí ( llamadas http, sockets, isolates…)

📂 domain

La carpeta domain contiene una carpeta llamada Models, que contiene las clases que representan los modelos de entidades de nuestro negocio.

Aquí es donde deberemos de introducir todo aquello que tiene relación con el negocio. Además he incluido otro tipo de carpetas para estructurar mejor los archivos.

📂 domain > exceptions

Colocaremos las excepciones específicas para cada caso.

📂 domain > models

Colocaremos todos los modelos necesarios. Internamente podemos separarlo por usos o necesidades.

📂 domain > repositories

Básicamente, los archivos incluidos hacen como una especie de puente. Solo los controladores pueden comunicarse con ellos. Si un controlador quiere recibir un User, entonces llamaría a un repository específico, que es el que se encargará de centralizar esas necesidades y se comunicará con su implementación de la carpeta data > datasource, que son los que finalmente realizan dicha necesidad (ejemplo: llamada a una API).

📂 domain > requests

Iremos añadiendo nuestras necesidades para cualquier tipo de request (login,register, getUser…).

📂 domain > reponses

Lo mismo que requests pero en este caso para las repuestas de esas peticiones.

📂 domain > usecases

Aquí tengo la duda de si usarla o no. En principio debería tener la lógica de los casos de uso de la aplicación tales como:

  • registerUser
  • loginUser
  • recoveryPassword

📂 presentation

Esta carpeta será una de las que más vaya creciendo y/o actualizándose. Incluiremos en ella todas las páginas/pantallas que necesitemos.

  • SplashScreen
  • LoginScreen
  • RegisterScreen
  • Profile

📂 presentation > shared

Incluiremos y diseccionaremos por carpetas lo que vayamos a compartir a nivel genérico y visual.

La idea es que estos archivos puedan tener algo de lógica de comportamiento por sí solos, sin ser obligatorio.

  • Widgets
  • Themes

📂 src

Aplicaremos todo tipo de archivos necesarios para la configuración de la aplicación y lo vamos a separar por necesidades o ambientes.

📂 src > config

Configuraciones específicas.

  • Iconos personalizados
  • Colores / Paleta de colores

📂 src > routes

Reuniremos todas las rutas de nuestras páginas

  • /login
  • /register
  • /article
  • /profile

📂 utils

Utils es la típica carpeta que en otros lenguages la suelen llamar helpers. La suelo usar para añadir o extender funcionalidades.

  • countLetters
  • capitalize
  • verifyEmail

Creo que no me dejo nada. Hay carpetas que suelen estar en otro tipo de proyectos como Infrastructure, pero en este caso la he obviado.

Ahora toca generar las carpetas.

Os he dejado el comando para que genere todo el scaffolding. Antes de lanzarlo hay que asegurarse de estar dentro de la carpeta lib.

# Antes de generar el scaffolding, asegúrese de estar en la carpeta lib.mkdir data domain appController presentation utils data/datasource domain/exceptions domain/models domain/repositories domain/requests domain/responses domain/usecases presentation/shared presentation/splash src/routes

Nos vemos, si tenéis cualquier duda, os leo en los comentarios.

Github repo: https://github.com/luiggibcn/bpf/tree/folder-structure-ddd

--

--

Christian Llansola
Christian Llansola

Written by Christian Llansola

Flutter developer, NodeJS, MongoDB, Laravel, Angular, UX/UI Designer and more interesting things like IoT, Elastic Stack…

No responses yet