59 KiB
lib/services/mock_service.dart
En este archivo, el uso de Map<String, dynamic> se encuentra como un parámetro en una función.
- Parámetro de Función: Future createWorkerProfile(Map<String, dynamic> data)
- Propósito: Esta función simula la creación de un perfil de trabajador en el backend. Acepta un Map llamado data que contiene toda la información del perfil del nuevo trabajador.
- Estructura del
Mapesperado: Aunque la función en sí misma no revela la estructura, el lugar donde se la llama (profile_setup_screen.dart) nos muestra exactamente qué datos se envían:
1 { 2 'full_name': String, 3 'bio': String, 4 'preferred_locations': List, 5 'max_distance_miles': double, 6 'skills': List, 7 'industries': List, 8 }
A continuación, analizaré el siguiente archivo: lib/widgets/shift_card.dart. ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ ✓ ReadFile lib/widgets/shift_card.dart │ │ │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ✦ Continuando el análisis:
lib/widgets/shift_card.dart
En este widget, el uso de Map<String, dynamic> se encuentra como el tipo de retorno de una función.
- Tipo de Retorno de Función: Map<String, dynamic> _calculateDuration()
- Propósito: Esta función calcula la duración de un turno en horas y devuelve también una cadena de texto para el tiempo de descanso.
- Estructura del
Mapdevuelto: 1 { 2 'hours': int, // La duración calculada del turno en horas. 3 'breakTime': String, // Una cadena de texto que representa el tiempo de descanso, ej: '1 hour'. 4 }
Siguiente archivo: lib/screens/auth/profile_setup_screen.dart. ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ ✓ ReadFile lib/.../profile_setup_screen.dart │ │ │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ✦ De acuerdo, aquí está el análisis del archivo.
lib/screens/auth/profile_setup_screen.dart
Este archivo contiene dos usos distintos de Map<String, dynamic>:
- Variable: static const List<Map<String, dynamic>> _steps
- Propósito: Define los pasos en el asistente de creación de perfiles.
- Estructura de cada elemento: 1 { 2 'id': String, 3 'title': String, 4 'icon': IconData 5 }
- Argumento de Función: El Map anónimo pasado a mockService.createWorkerProfile({ ... })
- Propósito: Recopilar y enviar los datos del perfil del nuevo usuario al servicio (en este caso, un mock).
- Estructura:
1 { 2 'full_name': String, 3 'bio': String, 4 'preferred_locations': List, 5 'max_distance_miles': double, 6 'skills': List, 7 'industries': List 8 }
Siguiente archivo: lib/screens/worker/worker_profile_screen.dart. ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ ✓ ReadFile lib/.../worker_profile_screen.dart │ │ │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ✦ Claro, aquí está el análisis del archivo.
lib/screens/worker/worker_profile_screen.dart
Este archivo contiene dos variables Map<String, dynamic> para datos de simulación (mock).
- Variable: final Map<String, dynamic> _user
- Propósito: Almacena los datos básicos de identificación del usuario para mostrarlos en la pantalla de perfil.
- Estructura: 1 { 2 'full_name': String, 3 'email': String, 4 }
- Variable: final Map<String, dynamic> _profile
- Propósito: Almacena estadísticas y atributos detallados del trabajador para mostrarlos en la pantalla de perfil.
- Estructura:
1 {
2 'level': String,
3 'photo_url': String?,
4 'total_shifts': int,
5 'average_rating': double,
6 'on_time_rate': int,
7 'no_show_count': int,
8 'cancellation_count': int,
9 'reliability_score': int,
10 'phone': String, 11 'skills': List, // Mockeado como una lista vacía 12 }
Siguiente archivo: lib/screens/worker/benefits_screen.dart. ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ ✓ ReadFile lib/.../worker/benefits_screen.dart │ │ │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ✦ De acuerdo, aquí está el análisis del siguiente archivo.
lib/screens/worker/benefits_screen.dart
Este archivo utiliza Map<String, dynamic> para gestionar los datos de los beneficios del trabajador.
- Variable: final List<Map<String, dynamic>> _benefitsData
- Propósito: Contiene los datos de simulación (mock) para los diferentes beneficios del trabajador, como días de enfermedad y vacaciones.
- Estructura de cada elemento:
1 {
2 'id': String,
3 'title': String,
4 'current': int,
5 'total': int,
6 'color': Color,
7 'description': String,
8 'history': List<Map<String, dynamic>>, // <- Lista anidada
9 'requestLabel': String,
10 'notice': String?, // Opcional
11 }
* Estructura anidada de history:
1 {
2 'date': String,
3 'status': String
4 }
- Parámetro de Función: void _handleRequest(Map<String, dynamic> benefit)
- Propósito: Maneja la acción cuando un usuario solicita un beneficio, tomando uno de los objetos Map de _benefitsData como entrada.
- Estructura: La misma que la de los elementos en _benefitsData.
- Parámetro de Widget: final Map<String, dynamic> benefit (en _BenefitCard)
- Propósito: El widget _BenefitCard utiliza un Map de _benefitsData para mostrar los detalles de un beneficio.
- Estructura: La misma que la de los elementos en _benefitsData.
Siguiente archivo: lib/screens/worker/worker_profile/compliance/documents_screen.dart. ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ ✓ ReadFile lib/.../documents_screen.dart │ │ │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ✦ Sigamos.
lib/screens/worker/worker_profile/compliance/documents_screen.dart
Este archivo, similar a otros, usa Map<String, dynamic> para la gestión de datos de UI.
- Variable: final List<Map<String, dynamic>> _requiredDocs
- Propósito: Almacena la lista de documentos de cumplimiento requeridos para el trabajador.
- Estructura de cada elemento:
1 { 2 'id': String, 3 'name': String, 4 'description': String, 5 'status': String // Ejemplo: 'verified', 'pending', 'missing' 6 }
- Parámetro de Función: Widget _buildDocumentCard(Map<String, dynamic> doc)
- Propósito: Es una función de construcción que crea una tarjeta de UI para un solo documento, tomando como entrada un Map de la lista _requiredDocs.
- Estructura: La estructura del parámetro doc es la misma que la de los elementos en la lista _requiredDocs.
Siguiente archivo: lib/screens/worker/worker_profile/onboarding/emergency_contact_screen.dart. ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ ✓ ReadFile l/.../emergency_contact_screen.dart │ │ │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ✦ Sigamos.
lib/screens/worker/worker_profile/onboarding/emergency_contact_screen.dart
Este archivo gestiona los contactos de emergencia del trabajador.
- Variable: final List<Map<String, dynamic>> _contacts
- Propósito: Almacena una lista de los contactos de emergencia del trabajador.
- Estructura de cada elemento:
1 { 2 'name': String, 3 'phone': String, 4 'relationship': String // Ejemplo: 'family', 'spouse', 'friend', 'other' 5 }
- Parámetro de Función: Widget _buildContactForm(int index, Map<String, dynamic> contact)
- Propósito: Es una función de construcción que toma un Map de un solo contacto de la lista _contacts para crear un formulario para ese contacto.
- Estructura: La estructura del parámetro contact es la misma que la de los elementos en la lista _contacts.
- Parámetro de Función: void _updateContact(int index, String field, dynamic value)
- Propósito: Esta función actualiza un campo dentro de un Map de contacto específico en la lista _contacts. El value es dynamic ya que puede ser un String de un TextField o de un DropdownButton.
- Estructura: No tiene una estructura de mapa específica, pero opera sobre los mapas dentro de la lista _contacts.
Siguiente archivo: lib/screens/worker/worker_profile/compliance/certificates_screen.dart. ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ ✓ ReadFile lib/.../certificates_screen.dart │ │ │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ✦ Okay, aquí está el análisis del archivo certificates_screen.dart.
lib/screens/worker/worker_profile/compliance/certificates_screen.dart
Este archivo maneja los certificados de cumplimiento del trabajador.
- Variable: final List<Map<String, dynamic>> _certificates
- Propósito: Almacena una lista de los certificados de cumplimiento del trabajador (por ejemplo, verificación de antecedentes, manipulador de alimentos).
- Estructura de cada elemento:
1 { 2 'id': String, 3 'name': String, 4 'icon': IconData, 5 'color': Color, 6 'description': String, 7 'status': String, // Ejemplo: 'complete', 'expiring', 'not_started' 8 'expiry': String?, // Cadena de fecha ISO 8601 que puede ser nula 9 }
- Parámetro de Función: Widget _buildCertificateCard(Map<String, dynamic> cert)
- Propósito: Es una función de construcción que crea una tarjeta de UI para un solo certificado, tomando como entrada un Map de la lista _certificates.
- Estructura: La estructura del parámetro cert es la misma que la de los elementos en _certificates.
- Parámetro de Función: void _showUploadModal(BuildContext context, Map<String, dynamic>? cert)
- Propósito: Esta función muestra una hoja modal para subir un certificado. Acepta un Map opcional cert. Si se proporciona cert, el modal es para renovar o ver ese certificado específico. Si es null, es para subir un nuevo certificado sin categoría.
- Estructura: La estructura del parámetro cert es la misma que la de los elementos en _certificates.
Siguiente archivo: lib/screens/worker/worker_profile/compliance/tax_forms_screen.dart. ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ ✓ ReadFile lib/.../tax_forms_screen.dart │ │ │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ✦ Sigamos.
lib/screens/worker/worker_profile/compliance/tax_forms_screen.dart
Este archivo gestiona la lista de formularios de impuestos del trabajador.
- Variable: final List<Map<String, dynamic>> _forms
- Propósito: Almacena una lista de los formularios de impuestos requeridos.
- Estructura de cada elemento:
1 { 2 'id': String, 3 'title': String, 4 'subtitle': String, 5 'description': String, 6 'status': String, // Ejemplo: 'submitted', 'not_started' 7 'icon': String, // Un emoji usado como icono 8 }
- Parámetro de Función: Widget _buildFormCard(Map<String, dynamic> form)
- Propósito: Es una función de construcción que crea una tarjeta de UI para un solo formulario de impuestos, tomando como entrada un Map de la lista _forms.
- Estructura: La estructura del parámetro form es la misma que la de los elementos en la lista _forms.
Siguiente archivo: lib/screens/worker/worker_profile/onboarding/personal_info_screen.dart. ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ ✓ ReadFile lib/.../personal_info_screen.dart │ │ │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ✦ Sigamos.
lib/screens/worker/worker_profile/onboarding/personal_info_screen.dart
Este archivo contiene los datos de simulación (mock) para el formulario de información personal.
- Variable: final Map<String, dynamic> _user
- Propósito: Almacena los datos básicos del usuario para mostrarlos en el formulario.
- Estructura:
1 { 2 'full_name': String, 3 'email': String, 4 'photo_url': String?, // Admite valores nulos 5 } * Nota: Esta versión del mock _user es ligeramente diferente a la de worker_profile_screen.dart, ya que incluye el campo photo_url.
Siguiente archivo: lib/screens/worker/worker_profile/onboarding/attire_screen.dart. ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ ✓ ReadFile lib/.../attire_screen.dart │ │ │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ✦ Sigamos.
lib/screens/worker/worker_profile/onboarding/attire_screen.dart
Este archivo maneja el "armario" o la vestimenta que posee el trabajador.
- Variable: final List<Map<String, dynamic>> _attireOptions
- Propósito: Proporciona una lista de opciones de vestimenta seleccionables para el trabajador.
- Estructura de cada elemento:
1 { 2 'id': String, 3 'label': String, 4 'icon': IconData, 5 'imageUrl': String, 6 }
(Nota: Este archivo también contiene Map<String, String> y Map<String, bool> para la gestión del estado, pero no coinciden con el tipo Map<String, dynamic>).
Siguiente archivo: lib/screens/worker/worker_profile/compliance/taxforms/form_i9_screen.dart. ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ ✓ ReadFile lib/.../form_i9_screen.dart │ │ │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ✦ Sigamos.
lib/screens/worker/worker_profile/compliance/taxforms/form_i9_screen.dart
Este archivo contiene el formulario I-9 y utiliza mapas para gestionar los datos del formulario y los pasos del asistente.
- Variable: final Map<String, dynamic> _formData
- Propósito: Almacena el estado de los campos del formulario I-9 mientras el usuario los completa.
- Estructura:
1 {
2 'lastName': String,
3 'firstName': String,
4 'middleInitial': String,
5 'otherLastNames': String,
6 'address': String,
7 'aptNumber': String,
8 'city': String,
9 'state': String?, // Admite valores nulos
10 'zipCode': String, 11 'dateOfBirth': String, 12 'ssn': String, 13 'email': String, 14 'phone': String, 15 'citizenshipStatus': String, 16 'uscisNumber': String, 17 'i94Number': String, 18 'foreignPassportNumber': String, 19 'countryOfIssuance': String, 20 'expirationDate': String, 21 }
- Variable: final List<Map<String, String>> _steps
- Nota: Aunque este no es un Map<String, dynamic>, sigue un patrón similar.
- Propósito: Define los pasos del asistente del formulario I-9.
- Estructura de cada elemento: 1 { 2 'title': String, 3 'subtitle': String, 4 }
- Parámetro de Función: void _updateField(String key, dynamic value)
- Propósito: Esta función actualiza un campo en el mapa _formData. El value es dynamic porque puede ser un String de un TextField o de un DropdownButton.
Siguiente archivo: lib/screens/worker/worker_profile/compliance/taxforms/form_w4_screen.dart. ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ ✓ ReadFile lib/.../form_w4_screen.dart │ │ │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ✦ Claro, aquí tienes el análisis.
lib/screens/worker/worker_profile/compliance/taxforms/form_w4_screen.dart
Este archivo contiene el formulario W-4 y, de manera similar al I-9, utiliza mapas para gestionar los datos.
- Variable: final Map<String, dynamic> _formData
- Propósito: Almacena el estado de los campos del formulario W-4 mientras el usuario los completa.
- Estructura:
1 {
2 'firstName': String,
3 'lastName': String,
4 'address': String,
5 'cityStateZip': String,
6 'ssn': String,
7 'filingStatus': String,
8 'multipleJobs': bool,
9 'qualifyingChildren': int,
10 'otherDependents': int, 11 'otherIncome': String, // Representa una cantidad en dólares 12 'deductions': String, // Representa una cantidad en dólares 13 'extraWithholding': String, // Representa una cantidad en dólares 14 }
- Variable: final List<Map<String, String>> _steps
- Nota: Aunque este es un List<Map<String, String>>, sigue un patrón de uso de mapas para definir metadatos.
- Propósito: Define los pasos del asistente del formulario W-4.
- Estructura de cada elemento: 1 { 2 'title': String, 3 'subtitle': String, 4 }
- Parámetro de Función: void _updateField(String key, dynamic value)
- Propósito: Esta función actualiza un campo en el mapa _formData. El value es dynamic porque puede ser un String, bool, o int dependiendo del campo del formulario que se esté actualizando.
Siguiente archivo: lib/screens/worker/worker_profile/level_up/trainings_screen.dart. ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ ✓ ReadFile lib/.../trainings_screen.dart │ │ │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ✦ De acuerdo.
lib/screens/worker/worker_profile/level_up/trainings_screen.dart
Este archivo contiene la lista de cursos de capacitación para los trabajadores.
- Variable: final List<Map<String, dynamic>> _courses
- Propósito: Almacena una lista de los cursos de capacitación disponibles.
- Estructura de cada elemento:
1 {
2 'id': String,
3 'title': String,
4 'description': String,
5 'duration_minutes': int,
6 'xp_reward': int,
7 'thumbnail_url': String?, // Admite valores nulos
8 'progress_percent': int,
9 'completed': bool,
10 }
Siguiente archivo: lib/screens/worker/worker_profile/finances/time_card_screen.dart. ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ ✓ ReadFile lib/.../time_card_screen.dart │ │ │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ✦ Okay, analicemos este archivo.
lib/screens/worker/worker_profile/finances/time_card_screen.dart
Este archivo se utiliza para mostrar el historial de horas trabajadas del empleado.
- Variable: final List<Map<String, dynamic>> _timesheets
- Propósito: Almacena una lista de registros de hojas de tiempo (timesheets) para los turnos trabajados.
- Estructura de cada elemento:
1 {
2 'id': String,
3 'shift_id': String,
4 'date': String, // Cadena en formato ISO 8601
5 'actual_start': String,
6 'actual_end': String,
7 'total_hours': double,
8 'hourly_rate': double,
9 'total_pay': double,
10 'status': String, // Ejemplo: 'pending', 'approved', 'paid' 11 'shift_title': String, 12 'client_name': String, 13 'location': String, 14 }
- Parámetro de Función: Widget _buildShiftHistory(List<Map<String, dynamic>> timesheets)
- Propósito: Es una función de construcción que toma una lista de mapas de hojas de tiempo para renderizar la sección de historial.
- Estructura: La estructura del parámetro timesheets es una lista de mapas, donde cada mapa tiene la misma estructura que los elementos en _timesheets.
- Parámetro de Función: Widget _buildTimesheetCard(Map<String, dynamic> timesheet)
- Propósito: Es una función de construcción que crea una tarjeta de UI para un único registro de hoja de tiempo de la lista _timesheets.
- Estructura: La estructura del parámetro timesheet es la misma que la de los elementos en _timesheets.
Siguiente archivo: lib/screens/worker/worker_profile/support/faqs_screen.dart. ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ ✓ ReadFile lib/.../support/faqs_screen.dart │ │ │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ✦ Sigamos.
lib/screens/worker/worker_profile/support/faqs_screen.dart
Este archivo contiene los datos para la pantalla de Preguntas Frecuentes (FAQs).
- Variable: final List<Map<String, dynamic>> _faqData
- Propósito: Almacena los datos para las preguntas frecuentes, organizados por categoría.
- Estructura de cada elemento (categoría):
1 {
2 'category': String,
3 'questions': List<Map<String, dynamic>>, // <- Lista anidada
4 }
* Estructura anidada de questions:
1 {
2 'q': String, // La pregunta
3 'a': String, // La respuesta
4 }
(Nota: Este archivo también contiene un Map<String, bool> llamado _openItems para gestionar el estado de la UI, pero no coincide con el tipo Map<String, dynamic>).
Siguiente archivo: lib/screens/worker/worker_profile/level_up/krow_university_screen.dart. ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ ✓ ReadFile lib/.../krow_university_screen.dart │ │ │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ✦ Sigamos.
lib/screens/worker/worker_profile/level_up/krow_university_screen.dart
Este archivo es para la sección de "KROW University" y contiene varios usos de Map<String, dynamic>.
- Variable: final Map<String, dynamic> _profile
- Propósito: Almacena un subconjunto de los datos del perfil del trabajador que son relevantes para la sección de universidad/capacitación.
- Estructura:
1 { 2 'level': String, 3 'xp': int, 4 'nextLevelXp': int, 5 'completed_courses': int, 6 } * Nota: Este mapa _profile es inconsistente con el que se encuentra en worker_profile_screen.dart, lo que demuestra la necesidad de un modelo de datos unificado.
- Variable: final List<Map<String, dynamic>> _categories
- Propósito: Define las categorías para los cursos de la universidad.
- Estructura de cada elemento:
1 { 2 'id': String, 3 'label': String, 4 'icon': IconData, 5 }
- Variable: final List<Map<String, dynamic>> _courses
- Propósito: Almacena una lista de los cursos universitarios disponibles.
- Estructura de cada elemento:
1 {
2 'id': String,
3 'title': String,
4 'description': String,
5 'category': String,
6 'duration_minutes': int,
7 'xp_reward': int,
8 'level_required': String,
9 'is_certification': bool,
10 'progress_percent': int, 11 'completed': bool, 12 }
- Parámetro de Función: Widget _buildCoursesGrid(List<Map<String, dynamic>> courses)
- Propósito: Es una función de construcción que toma una lista de mapas de cursos (filtrados de _courses) para renderizarlos en una cuadrícula.
- Estructura: La estructura del parámetro courses es una lista de mapas, donde cada mapa tiene la misma estructura que los elementos en _courses.
Siguiente archivo: lib/screens/worker/worker_profile/level_up/leaderboard_screen.dart. ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ ✓ ReadFile lib/.../leaderboard_screen.dart │ │ │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ✦ Sigamos con el siguiente archivo.
lib/screens/worker/worker_profile/level_up/leaderboard_screen.dart
Este archivo es para la pantalla de la tabla de clasificación (Leaderboard) y utiliza mapas extensivamente para manejar los datos de los perfiles.
- Variable: final List<Map<String, dynamic>> _profiles
- Propósito: Almacena los datos de simulación (mock) para la tabla de clasificación, representando diferentes perfiles de trabajadores.
- Estructura de cada elemento:
1 { 2 'id': String, 3 'name': String, 4 'photo_url': String?, // Admite valores nulos 5 'xp': int, 6 'level': String, 7 'user_id': String, 8 }
- Variable: final sortedProfiles = List<Map<String, dynamic>>.from(_profiles)
- Propósito: Crea una copia mutable de la lista _profiles que puede ser ordenada por XP.
- Estructura: Los elementos tienen la misma estructura que en _profiles.
- Parámetro de Función: Widget _buildPodium(List<Map<String, dynamic>> topThree)
- Propósito: Es una función de construcción que toma los tres perfiles principales para renderizar la sección del podio.
- Estructura: La lista topThree contiene mapas con la misma estructura que en _profiles.
- Parámetro de Función: Widget _buildPodiumItem(Map<String, dynamic> profile, ...)
- Propósito: Es una función de construcción para crear la UI de un solo perfil en el podio.
- Estructura: El parámetro profile tiene la misma estructura que un elemento en _profiles.
- Parámetro de Función: Widget _buildRestList(List<Map<String, dynamic>> rest, ...)
- Propósito: Es una función de construcción que toma el resto de los perfiles (que no están en el top tres) para renderizarlos como una lista estándar.
- Estructura: La lista rest contiene mapas con la misma estructura que en _profiles.
Siguiente archivo: lib/screens/worker/worker_profile/finances/bank_account_screen.dart. ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ ✓ ReadFile lib/.../bank_account_screen.dart │ │ │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ✦ Sigamos.
lib/screens/worker/worker_profile/finances/bank_account_screen.dart
Este archivo maneja las cuentas bancarias del trabajador.
- Variable: final List<Map<String, dynamic>> _accounts
- Propósito: Almacena una lista de las cuentas bancarias vinculadas del trabajador.
- Estructura de cada elemento:
1 { 2 'id': int, 3 'bank': String, 4 'type': String, // Ejemplo: 'Checking', 'Savings' 5 'last4': String, 6 'isPrimary': bool, 7 }
- Parámetro de Función: Widget _buildAccountCard(Map<String, dynamic> account)
- Propósito: Es una función de construcción que crea una tarjeta de UI para una sola cuenta bancaria, tomando como entrada un Map de la lista _accounts.
- Estructura: La estructura del parámetro account es la misma que la de los elementos en la lista _accounts.
Siguiente archivo: lib/screens/worker/payments_screen.dart. ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ ✓ ReadFile lib/.../worker/payments_screen.dart │ │ │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ✦ Sigamos.
lib/screens/worker/payments_screen.dart
Este archivo muestra el historial de pagos y ganancias del trabajador.
- Variable: final List<Map<String, dynamic>> _recentPayments
- Propósito: Almacena los datos de simulación (mock) para una lista de registros de pagos recientes.
- Estructura de cada elemento:
1 {
2 'date': String,
3 'title': String,
4 'location': String,
5 'address': String,
6 'workedTime': String,
7 'amount': double,
8 'status': String, // Ejemplo: 'paid'
9 'hours': int,
10 'rate': int, // Nota: Esto es un int en el mock, pero probablemente debería ser double como en otros lugares. 11 } * Nota: El widget PaymentHistoryItem que consume estos datos espera que rate sea un double, por lo que el int en los datos del mock es probablemente una pequeña inconsistencia.
Siguiente archivo: lib/screens/worker/availability_screen.dart. ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ ✓ ReadFile lib/.../availability_screen.dart │ │ │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ✦ Okay, aquí está el análisis del archivo de disponibilidad.
lib/screens/worker/availability_screen.dart
Este archivo maneja la configuración de la disponibilidad del trabajador.
- Variable: final List<Map<String, dynamic>> _timeSlots
- Propósito: Define las propiedades de los diferentes rangos horarios (Mañana, Tarde, Noche) que el usuario puede seleccionar.
- Estructura de cada elemento:
1 { 2 'id': String, 3 'label': String, 4 'time': String, // Ejemplo: '4:00 AM - 12:00 PM' 5 'icon': IconData, 6 'bg': Color, 7 'iconColor': Color, 8 }
(Nota: Este archivo también utiliza Map<String, bool> y Map<String, Map<String, bool>> para gestionar el estado de la disponibilidad, pero no coinciden con el tipo Map<String, dynamic>).
Siguiente archivo: lib/screens/worker/clock_in_screen.dart. ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ ✓ ReadFile lib/.../worker/clock_in_screen.dart │ │ │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ✦ Okay, aquí está el análisis del último archivo de la lista.
lib/screens/worker/clock_in_screen.dart
Este archivo gestiona la pantalla de fichaje (check-in/check-out) del trabajador.
- Variable: final List<Map<String, dynamic>> _recentActivity
- Propósito: Almacena una lista de las actividades recientes de fichaje del trabajador.
- Estructura de cada elemento:
1 { 2 'date': DateTime, 3 'start': String, // Ejemplo: '09:00 AM' 4 'end': String, // Ejemplo: '05:00 PM' 5 'hours': String, // Ejemplo: '8h' 6 }
✦ He analizado lib/screens/worker/worker_profile/support/messages_screen.dart.
Este archivo contiene dos estructuras principales de List<Map<String, dynamic>>:
- Nombre de la variable: _conversations
- Propósito: Representa una lista de conversaciones de chat.
- Estructura de cada elemento
Map<String, dynamic>(que representa una conversación individual):
1 {
2 'sender_id': String, // ID del remitente/otra parte en la conversación
3 'sender_name': String, // Nombre visible del remitente/otra parte
4 'lastMessage': String, // Contenido del último mensaje en la conversación
5 'lastTime': DateTime, // Marca de tiempo del último mensaje
6 'unread': int, // Número de mensajes no leídos en la conversación
7 'messages': List<Map<String, dynamic>>, // Lista anidada de mensajes individuales dentro de la conversación
8 }
* Estructura Anidada (messages): Cada elemento en la lista messages tiene:
1 { 2 'content': String, // El contenido del mensaje 3 'sender_id': String, // El ID del remitente de este mensaje específico 4 }
El siguiente archivo es: lib/screens/worker/worker_profile/onboarding/attire_screen.dart.
He finalizado el análisis de todos los archivos que contenían Map<String, dynamic>. Has podido ver que este tipo de mapa se usa de forma muy extendida en todo el proyecto para simular datos, pasar parámetros y definir el estado de los widgets.
La principal conclusión es la falta de modelos de datos formales (clases Dart), lo que lleva a la duplicación e inconsistencia de las estructuras de datos en diferentes pantallas.
Mi recomendación principal, como ingeniero senior, sería refactorizar este código para usar clases de modelo fuertemente tipadas. Esto mejoraría enormemente la mantenibilidad, la legibilidad y la seguridad del código, reduciendo errores a largo plazo.
¿Hay alguna de estas estructuras que te interese formalizar en una clase Dart ahora? O, ¿tienes alguna otra pregunta?
Using: 1 GEMINI.md file