App móvil2024Prototipo

Contrata u ofrece
servicios

Contrata u ofrece servicios: el directorio de oficios de Venezuela, en el bolsillo

Aplicación móvil · Marketplace de servicios

Desarrollador móvil Flutter — diseño de interfaz, arquitectura de vistas, flujo de acceso y sistema de diseño

Prototipo funcional. El repositorio público contiene el flujo de acceso completo y el esqueleto de navegación; la integración con backend está presente pero comentada en el código.

01 / El barrio

Cada oficio es un punto suelto

Antes de la app, el directorio de oficios existe: está repartido en cadenas de WhatsApp, grupos de Facebook y la memoria de los vecinos. Lo que no existe es la línea que une un punto con otro.

de contactos sueltos a directorio

El problema

En Venezuela contratar un oficio —plomería, electricidad, mantenimiento, delivery, cualquier servicio de barrio— se resuelve por cadena de WhatsApp, recomendación de vecino o grupo de Facebook. No hay un lugar donde el que ofrece publique de forma verificable ni donde el que contrata compare antes de decidir, y el proceso se pierde en mensajes sueltos, precios que no se sostienen y contactos que nunca responden. Del otro lado, el profesional independiente carece de una vitrina propia: su reputación vive en la memoria de sus clientes y no viaja a nadie más.

La solución

Una aplicación móvil de doble rol que se instala una sola vez y sirve tanto para contratar como para ofrecer. El acceso arranca en una pantalla de bienvenida que plantea la elección desde el primer segundo —«¡Regístrate!» u «Iniciar Sesión»— y continúa en hojas modales deslizables que evitan cambios de pantalla bruscos. El registro captura identidad real con los formatos del país (RIF/CI con letra, teléfono con prefijo de operadora, fecha de nacimiento) y la valida con un código de seis dígitos enviado por correo antes de dejar entrar a nadie. Ya adentro, un shell de cuatro pestañas organiza la vida del usuario y un catálogo con buscador, categorías visuales y modal de ordenamiento permite recorrer la oferta.

02 / La baraja

Un mazo de fichas sobre el plano

La metáfora que gobierna toda la interfaz: cada oficio es una carta de cuatro capas —base azul, ilustración, banda de vidrio esmerilado y pastilla crema— repartida sobre la rejilla del barrio. Pasa el cursor por encima.

Plomería

ServiciosYa · Venezuela

Hoy mismo

Plomería

Hoy mismo

Electricidad

ServiciosYa · Venezuela

3 cerca

Electricidad

3 cerca

Refrigeración

ServiciosYa · Venezuela

24 h

Refrigeración

24 h

Manicura

ServiciosYa · Venezuela

A domicilio

Manicura

A domicilio

Delivery

ServiciosYa · Venezuela

20 min

Delivery

20 min

Capa 0

Rectángulo plano en #416AAF: el suelo de la ficha.

Capa 20

La ilustración del oficio, recortada a 10 px de radio.

Capa 40

Vidrio esmerilado: desenfoque de 4 px y velo negro al 26 %.

Capa 60

Pastilla crema #EDE5CC: la única mancha cálida y lo único accionable.

03 / Lo que sostiene

Seis decisiones que dan forma al prototipo

01

Un binario, dos roles

La pantalla de bienvenida no pregunta «¿eres cliente o proveedor?»: plantea contratar y ofrecer como la misma puerta. El mismo registro y el mismo shell de navegación sirven a los dos lados del mercado.

02

Registro con formatos venezolanos

Campos compuestos en lugar de inputs genéricos: selector de letra (V) más RIF/CI con contador 0/9, desplegable de prefijo (412) más número con contador 0/8, y fecha DDMMYYYY contada carácter a carácter mientras se escribe.

03

Verificación por código de seis dígitos

Pantalla dedicada con seis casillas independientes, botón de reenvío y salida de emergencia («¿Correo incorrecto? Regresar») para que un tipeo mal hecho no deje al usuario atrapado en el embudo.

04

Hojas modales en vez de pantallas

Registro e inicio de sesión se abren como bottom sheets al 85 % de la altura, con esquinas superiores redondeadas de 20 px y tirador gris centrado. La bienvenida permanece detrás, atenuada, sin perder el contexto.

05

Shell de cuatro pestañas flotante

Barra inferior propia dentro de un ClipRRect de 20 px de radio y 70 px de alto, con extendBody activo para que el contenido corra por debajo. Iconos SVG que cambian de versión rellena a lineal según la pestaña activa.

06

Sistema de color en un solo archivo

Toda la paleta y los tres degradados de la app viven en la clase estática AppColor: azul primario, crema secundario y las capas de sombra negra que hacen legible el texto sobre fotografía.

04 / El flujo

De la bienvenida al panel

Los cuatro pasos reales del acceso, recreados pantalla por pantalla. Ninguno es una captura: todo está redibujado en HTML y CSS a partir del código.

1Una puerta, dos caminos

Contrata u ofrece servicios

Optimiza tu tiempo y agiliza la contratación.

¡Regístrate!
Iniciar Sesion

Al usar ServiciosYa, estás aceptando nuestros
Terminos de Servicios y Políticas de Privacidad.

Bienvenida

2Identidad con formatos del país

Contrata u ofrece servicios

Optimiza tu tiempo y agiliza la contratación.

¡Regístrate!
Iniciar Sesion

Al usar ServiciosYa, estás aceptando nuestros
Terminos de Servicios y Políticas de Privacidad.

Registro

V
RIF/CI

0/9

Nombre
Apellido
Correo
412
Número de teléfono

0/8

Ingrese fecha (DDMMYYYY)

0/8

Contraseña
Registrar

¿Ya tienes una cuenta? Entrar

Registro

3Seis dígitos por correo

Verificación
del código

Le enviamos un código por correo electrónico, por favor ingréselo a continuación

4
8
2
9
1
3

Ingrese el código recibido por correo electrónico

Reenviar código

¿Correo incorrecto? Regresar

Verificación del código

4Cuatro pestañas flotantes
ServiciosYa
Buscar un oficio…
Productos más vendidosver todo

Instalación de aire

4,8 ★ · 35 min

Reparación eléctrica

4,6 ★ · 1 h

Recomendados

CerrajeríaDesde $8
JardineríaDesde $8

Vendidos recientemente

Pintura de fachadaCaracas · ayer
Destape de tuberíasMaracay · hace 2 d
Mantenimiento de neveraValencia · hace 3 d

Panel principal y shell de pestañas

05 / Anatomía

Un formulario venezolano

El RIF y la cédula llevan letra separada del número, el móvil se identifica por prefijo de operadora y la fecha se escribe corrida. Ningún input genérico resuelve eso, así que el registro se armó con campos compuestos.

V
RIF/CI

0/9

412
Número de teléfono

0/8

Ingrese fecha (DDMMYYYY)

0/8

Registrar

¿Ya tienes una cuenta? Entrar

Borde azul en el selector, gris oscuro en el campo largo
Contador bajo la línea, alineado a la derecha
16 px entre campos y rebote elástico al desplazar
Padding inferior atado a MediaQuery.viewInsets

Contrata u ofrece servicios

Optimiza tu tiempo y agiliza la contratación.

¡Regístrate!
Iniciar Sesion

Al usar ServiciosYa, estás aceptando nuestros
Terminos de Servicios y Políticas de Privacidad.

Iniciar

Correo
Contraseña
Entrar

¿Olvidaste tu Contraseña? Restaurar

Inicio de sesión

Dos campos, un botón y el tercio inferior vacío: el pulgar cae justo encima de «Entrar».

06 / En el dispositivo

Grabado sobre un Android real

Catorce segundos de recorrido y cuatro capturas directas del prototipo compilado.

Recorrido en vídeo de 14 segundos sobre dispositivo Android: bienvenida, apertura de la hoja de registro y hoja de inicio de sesión.

Pantalla de bienvenida: «Contrata u ofrece servicios», con ilustración del acuerdo firmado y los botones ¡Regístrate! e Iniciar Sesión.
Pantalla de bienvenida: «Contrata u ofrece servicios», con ilustración del acuerdo firmado y los botones ¡Regístrate! e Iniciar Sesión.
Verificación del código: seis casillas independientes para el código enviado por correo, con reenvío y retorno al paso anterior.
Verificación del código: seis casillas independientes para el código enviado por correo, con reenvío y retorno al paso anterior.
Hoja modal de inicio de sesión sobre la bienvenida atenuada: correo, contraseña, botón Entrar y enlace de restauración.
Hoja modal de inicio de sesión sobre la bienvenida atenuada: correo, contraseña, botón Entrar y enlace de restauración.
Hoja modal de registro con los campos compuestos venezolanos: letra de documento más RIF/CI (0/9), prefijo 412 más teléfono (0/8) y fecha DDMMYYYY.
Hoja modal de registro con los campos compuestos venezolanos: letra de documento más RIF/CI (0/9), prefijo 412 más teléfono (0/8) y fecha DDMMYYYY.

arrastra para recorrer las capturas

07 / Funcionalidades

Dieciocho piezas ya construidas

Presentadas como la lista vertical de la propia app: miniatura a la izquierda, texto a la derecha.

01Pantalla de bienvenida a sangre completa con ilustración de fondo y degradado negro ascendente sobre el 60 % inferior
02Registro en hoja modal con RIF/CI, letra de documento, nombre, apellido, correo, teléfono con prefijo, fecha de nacimiento y contraseña
03Inicio de sesión en hoja modal con correo, contraseña y enlace de restauración
04Verificación de cuenta mediante código de seis dígitos enviado al correo, con reenvío y retorno al paso anterior
05Shell de navegación de cuatro pestañas: Inicio, Analítica, Ventas y Gastos
06Menú lateral (Drawer) con Inventario, Usuarios, Novedades, Notificaciones, Configuración y cierre de sesión
07Portada con carrusel horizontal destacado, fila de recomendados y lista vertical de actividad reciente
08Pantalla de exploración con cuadrícula de seis categorías ilustradas y tarjeta destacada
09Buscador dedicado con campo translúcido sobre el azul primario y resultados en lista
10Modal de ordenamiento con opciones Más nuevos, Más viejos y Popular, más acciones de Resetear y Cancelar
11Pantalla de guardados con buscador propio y botón de filtro en color crema
12Perfil con foto circular de 130 px, acción de cambiar imagen y fichas de correo, nombre, tipo de suscripción y vigencia
13Pantalla de detalle con descripción, lista de insumos, pasos numerados y reseñas de usuarios
14Visor de imagen a pantalla completa
15Tarjetas con efecto de vidrio esmerilado: BackdropFilter de 4 px de desenfoque sobre la foto, con velo negro al 26 %
16Iconografía completamente vectorial mediante flutter_svg, tintada en tiempo de ejecución según el estado
17Tipografías Inter (seis pesos) y Open Sans (cuatro pesos) empaquetadas en el binario
18Compilación configurada para seis plataformas: Android, iOS, web, macOS, Linux y Windows
08 / Stack

Con qué está hecho

Aplicación
FlutterDart SDK ^3.5.2Material DesignMaterialApp con ThemeData propio
Interfaz
flutter_svg 2.0.10+1BottomNavigationBar personalizadoshowModalBottomSheetBackdropFilter / ImageFilter.blurBouncingScrollPhysicsInter (6 pesos)Open Sans (4 pesos)
Datos y estado
sqflite 2.3.3+1 (declarado)Modelos Dart con factory fromJson / toMapRecipeHelper como capa de datos estáticosStatefulWidget + setStateTextEditingControllerGlobalKey<FormState>
Calidad
flutter_lints 4.0.0analysis_options.yamlflutter_test
Plataformas
AndroidiOSWebmacOSLinuxWindows
09 / Arquitectura

Datos y presentación, separados en serio

main.dart · WelcomePagemodels/corefromJson · toMapmodels/helperRecipeHelper (memoria)views/screens11 · auth/views/widgets16 · modals/views/utilsAppColorPageSwitcher · barra propia

lib/ — el mapa completo

Arquitectura por capas dentro de lib/, con separación estricta entre datos y presentación. models/core aloja las entidades con sus constructores factory desde JSON y sus métodos toMap; models/helper concentra la capa de datos —hoy servida desde estructuras estáticas en memoria— de modo que sustituirla por una fuente remota o por sqflite no obliga a tocar ninguna vista. views/ se divide a su vez en tres: screens/ (once pantallas, con auth/ aislado para el flujo de acceso), widgets/ (dieciséis piezas reutilizables, con modals/ como subcarpeta propia para las tres hojas deslizables) y utils/, donde AppColor centraliza la identidad visual completa. La navegación es imperativa: main.dart arranca en WelcomePage y, tras el acceso, PageSwitcher hace de contenedor de pestañas resolviendo la vista activa por índice sobre una lista de widgets, con la barra inferior como componente propio y no como el widget estándar de Material. El acoplamiento entre pantallas se limita a Navigator.push con MaterialPageRoute y al paso del modelo por constructor. La base de vistas reutiliza el andamiaje de una aplicación de catálogo previa —de ahí los nombres de dominio heredados en modelos y widgets— que se fue reetiquetando hacia el dominio de servicios; el flujo de acceso, en cambio, está escrito íntegramente para ServiciosYa.

10 / Retos

Cinco tropiezos y sus salidas

1El tropiezo

Validar la experiencia de acceso completa antes de tener backend disponible, sin dejar el flujo roto ni obligar al evaluador a imaginarse los pasos siguientes.

La salida

El bloque de autenticación contra Firebase Auth y la comprobación posterior contra la colección de usuarios en Firestore quedaron escritos y comentados dentro del modal de inicio de sesión, con su manejo de errores por código (user-not-found, wrong-password) ya redactado. El botón navega directo al shell de pestañas, de modo que la aplicación se recorre entera y la conexión real se activa descomentando un bloque acotado.

2El tropiezo

Los formularios genéricos no sirven para identidad venezolana: el RIF y la cédula llevan letra separada del número, los móviles se identifican por prefijo de operadora y la fecha se escribe corrida, sin separadores.

La salida

Se construyeron campos compuestos en lugar de inputs planos. Un desplegable estrecho con borde azul sostiene la letra del documento o el prefijo, y el campo largo contiguo recibe solo los dígitos con su contador de longitud visible bajo la línea (0/9 para el documento, 0/8 para el teléfono y para la fecha DDMMYYYY), de forma que el usuario sabe cuánto le falta sin esperar a un mensaje de error.

3El tropiezo

Abrir el registro y el inicio de sesión como pantallas nuevas rompía la continuidad visual: la ilustración de bienvenida desaparecía y el usuario perdía la referencia de dónde estaba.

La salida

Ambos se resolvieron como bottom sheets con isScrollControlled activo, altura fija al 85 % de la pantalla, esquinas superiores de 20 px y tirador gris centrado del 35 % del ancho. La bienvenida permanece visible y atenuada detrás, y el padding inferior de la lista se ata a MediaQuery.viewInsets para que el teclado nunca tape el campo enfocado.

4El tropiezo

Mantener una identidad visual coherente sobre fotografías de fondo de brillo impredecible, donde el texto blanco unas veces se lee y otras se pierde.

La salida

AppColor define tres degradados reutilizables como capas de contraste: linearBlackBottom y linearBlackTop, que oscurecen el borde correspondiente hasta transparente, y bottomShadow, un cian al 20 % que se desvanece hacia arriba. Las tarjetas destacadas añaden además un BackdropFilter de 4 px con velo negro al 26 % bajo el texto, garantizando legibilidad sea cual sea la imagen.

5El tropiezo

El shell de pestañas reconstruye la pantalla activa en cada toque, porque resuelve la vista indexando una lista de widgets recién instanciada dentro del build.

La salida

Es la deuda técnica identificada más clara del prototipo: el estado de scroll y los controladores se pierden al cambiar de pestaña. La ruta natural es sustituir esa lista por un IndexedStack o un PageView con PageController, un cambio contenido en un único archivo gracias a que la barra inferior ya está desacoplada como componente independiente.

11 / Ficha técnica

El prototipo en números y en color

11

pantallas Flutter

16

widgets reutilizables

5.550

líneas de Dart

23

iconos SVG propios

10

archivos tipográficos

6

plataformas configuradas

La paleta

primary#416AAF
secondary#EDE5CC
accent#2BAFCB
bg#FFFFFF
surface#EEF4F4
text#000000

linear-gradient(160deg, #416AAF 0%, #2BAFCB 100%)

Azul institucional sereno con acentos crema y un cian de aire caribeño. Confiable sin ser corporativo, cercano sin ser informal: la paleta de una libreta de contactos de barrio que decidió tomarse en serio.

lib/views/utils/AppColor.dart — primary y primarySoft = Color.fromARGB(255, 65, 106, 175) → #416AAF; secondary = #EDE5CC; primaryExtraSoft = #EEF4F4; el cian del degradado bottomShadow = Color.fromARGB(255, 43, 175, 203) → #2BAFCB. Fondo blanco de lib/main.dart (scaffoldBackgroundColor: Colors.white) y texto negro de los encabezados. El valor gradient combina primary con el cian de bottomShadow y es la única entrada compuesta por mí; el resto son valores literales del código.

En una página

App móvil2024Prototipo

ServiciosYa es una aplicación Flutter para Android, iOS y web cuyo mensaje de bienvenida lo dice todo: «Contrata u ofrece servicios. Optimiza tu tiempo y agiliza la contratación». Un mismo binario sirve a las dos caras del mercado: quien necesita un oficio resuelto y quien vive de resolverlo.

El repositorio público (commit inicial del 24 de septiembre de 2024) reúne 30 archivos Dart y 5.550 líneas: once pantallas, dieciséis widgets reutilizables, una capa de modelos con serialización desde JSON y un sistema de color centralizado en una sola clase estática.

El flujo de entrada está resuelto de punta a punta: pantalla de bienvenida a sangre completa con degradado, hoja modal de registro al 85 % de la altura, hoja modal de inicio de sesión y verificación por código de seis dígitos enviado al correo.

El registro está pensado para Venezuela y no para un formulario genérico: selector de letra de documento (V) junto al campo RIF/CI con contador 0/9, prefijo telefónico desplegable (412) con contador 0/8 y fecha en formato DDMMYYYY, también contada carácter a carácter.

Todo el aparato visual se apoya en recursos propios: 23 iconos SVG vectoriales (analítica, ventas, financiero, reporte de negocios, filtro, cámara, etiqueta de precio), 33 imágenes y dos familias tipográficas empaquetadas con diez pesos entre Inter y Open Sans.

Desarrollador móvil Flutter — diseño de interfaz, arquitectura de vistas, flujo de acceso y sistema de diseño

PlomeríaElectricidadRefrigeraciónManicuraDeliveryAlbañileríaCerrajeríaMudanzasJardineríaContrata u ofreceDirectorio de oficiosVenezuelaPlomeríaElectricidadRefrigeraciónManicuraDeliveryAlbañileríaCerrajeríaMudanzasJardineríaContrata u ofreceDirectorio de oficiosVenezuela

ServiciosYa

¿Quieres algo así para tu producto?

Un marketplace de oficios con doble rol, formularios pensados para el país y un sistema de diseño en un solo archivo. Si necesitas una app móvil con flujo de acceso serio y una interfaz que se sostenga sola, es terreno conocido.