Esta guía está diseñada para que cualquier desarrollador, incluso con experiencia limitada en Flutter, pueda entender rápidamente la organización de la aplicación, cómo interactúan sus componentes y, lo más importante, cómo añadir nuevas funcionalidades y contenido.
La "App Curso de Python" es una aplicación móvil desarrollada con Flutter que ofrece lecciones interactivas de Python. Su principal característica es la presentación de contenido educativo con texto explicativo, ejemplos de código con resaltado de sintaxis y funcionalidad de copiar, y una navegación sencilla entre lecciones. La aplicación también soporta el modo oscuro del sistema y enlaces externos a través de un menú lateral.
Propósito Principal:
- Enseñanza de Python: Proporcionar un recurso accesible para aprender Python de forma autodidacta.
- Contenido Estructurado: Presentar lecciones de manera organizada, con descripciones y ejemplos de código.
- Interactividad: Permitir la copia de código y la navegación intuitiva.
- Adaptabilidad: Funcionar en diferentes dispositivos y con temas de sistema.
El proyecto sigue una estructura modular y lógica, diseñada para la escalabilidad y la fácil localización de componentes:
python_course_app/
├── android/ # Archivos específicos de la plataforma Android
├── ios/ # Archivos específicos de la plataforma iOS
├── lib/ # ¡Aquí está la magia de Flutter!
│ ├── main.dart # Punto de entrada de la aplicación
│ ├── models/ # Definiciones de modelos de datos
│ │ └── lesson.dart # Clases Lesson y CodeExample
│ ├── screens/ # Widgets que representan pantallas completas
│ │ ├── home_page.dart # Pantalla principal con lista de lecciones
│ │ └── lesson_page.dart # Pantalla para el contenido de cada lección
│ └── widgets/ # Widgets reutilizables más pequeños
│ └── code_block.dart # Widget para mostrar bloques de código
├── assets/ # Recursos de la aplicación (ej. imágenes de íconos)
│ └── app_icon.png
├── pubspec.yaml # Configuraciones del proyecto y dependencias
├── README.md # Documentación del proyecto
└── ... (otros archivos de configuración de Flutter)
Explicación de cada directorio clave:
-
lib/main.dart:- Es el corazón de la aplicación, donde todo comienza.
- Configura el
MaterialApp, que es el widget raíz de una aplicación Flutter que implementa el diseño de Material Design. - Define los temas de la aplicación (
themepara modo claro ydarkThemepara modo oscuro), permitiendo que la interfaz se adapte automáticamente al tema del sistema del usuario (themeMode: ThemeMode.system). - Establece la pantalla inicial (
home) de la aplicación, que esHomePage.
-
lib/models/:- Contiene las estructuras de datos (modelos) de la aplicación.
lesson.dart: Define las clases Dart que representan la información de las lecciones:Lesson: Objeto que representa una lección completa, incluyendo sutitle(título),description(descripción general) y una lista decodeExamples.CodeExample: Objeto que representa un bloque de código específico dentro de una lección, con su propiotitle(título del ejemplo),code(el código Python en sí),language(el lenguaje para el resaltado de sintaxis, por defecto 'python') ycodeExplanation(la descripción detallada de ese código).
- Importancia: Separar los modelos de las vistas (screens/widgets) es una buena práctica de diseño (similar a MVC o MVVM), ya que permite que la lógica de datos sea independiente de la lógica de la interfaz de usuario.
-
lib/screens/:- Contiene los widgets que representan pantallas completas de la aplicación. Son los "contenedores" principales de la interfaz de usuario.
home_page.dart:- Es la pantalla principal que el usuario ve al abrir la aplicación.
- Muestra una
AppBarcon el título de la aplicación. - Contiene un
Drawer(el menú "hamburguesa") con enlaces a redes sociales y una sección "Acerca de". - Utiliza un
ListView.builderpara mostrar una lista deCardwidgets, cada uno representando una lección. - La lógica de navegación (
Navigator.push) se encuentra aquí, para pasar el objetoLessonseleccionado a laLessonPage. - ¡Importante! La lista de lecciones (
final List<Lesson> lessons = const [...]) se define directamente en este archivo. Este es el lugar clave para añadir, modificar o eliminar contenido del curso.
lesson_page.dart:- Es la pantalla de detalle para una lección específica.
- Recibe un objeto
Lessona través de su constructor (required this.lesson). - Muestra el título de la lección en la
AppBary ladescriptionde la lección en el cuerpo. - Itera sobre la lista
lesson.codeExamplespara mostrar cada bloque de código y su explicación asociada. - Organización del contenido: Usa un
SingleChildScrollViewpara asegurar que el contenido sea desplazable si excede el tamaño de la pantalla, y unColumnpara organizar verticalmente la descripción, los títulos de los ejemplos y losCodeBlocks con sus explicaciones.
-
lib/widgets/:- Contiene widgets reutilizables más pequeños que pueden ser utilizados en múltiples pantallas. Promueve la modularidad y evita la duplicación de código.
code_block.dart:- Este es un widget especializado para mostrar y permitir copiar ejemplos de código Python.
- Utiliza la librería
flutter_highlightpara el resaltado de sintaxis, que automáticamente colorea el código según el lenguaje especificado (en nuestro caso, Python). - Incluye un
IconButtonpara la funcionalidad de "copiar al portapapeles" usandoClipboard.setData. - Está diseñado para ser genérico, aceptando
title,codeylanguagecomo propiedades, lo que lo hace muy reutilizable.
- Inicio de la App (
main.dart): La aplicación arranca y muestraHomePage. - Carga de Lecciones (
home_page.dart):HomePagecarga la lista estática de objetosLessonque están definidos dentro de sí misma. - Listado de Lecciones (
home_page.dart): ElListView.builderitera sobre esta lista deLessony crea unaCardpara cada una. - Selección de Lección (
home_page.dartalesson_page.dart): Cuando el usuario toca unaCardde lección, elonTapdeListTile(oInkWellsi se usó) utilizaNavigator.pushpara ir a laLessonPage. Crucialmente, el objetoLessoncompleto de la lección seleccionada se pasa como argumento al constructor deLessonPage. - Visualización del Contenido (
lesson_page.dart):LessonPagerecibe el objetoLessony usa sus propiedades (lesson.title,lesson.description,lesson.codeExamples) para construir la interfaz. - Renderizado de Código (
lesson_page.dartusandocode_block.dart): Dentro deLessonPage, se itera sobrelesson.codeExamples. Para cadaCodeExample, se crea una instancia del widgetCodeBlock, pasándole el título, el código y el lenguaje del ejemplo. - Copia de Código (
code_block.dart): ElCodeBlockmaneja internamente la lógica de copiar su propio texto de código al portapapeles.
El diseño actual facilita la expansión del contenido. No necesitas modificar la lógica central de la aplicación para añadir más lecciones.
-
Abre el archivo
lib/screens/home_page.dart. -
Busca la línea donde se define la lista
final List<Lesson> lessons = const [...]. -
Para añadir una nueva lección:
- Simplemente añade un nuevo objeto
Lesson(...)a esta lista, asegurándote de seguir el formato existente. - Cada
Lessondebe tener untitle(String), unadescription(String) y una lista decodeExamples(List<CodeExample>). - Cada
CodeExampledebe tener untitle(String),code(String - tu código Python, ¡usa triple comillas"""para multilínea!),language(String, por defecto 'python'), y ahora uncodeExplanation(String, explica el código).
- Simplemente añade un nuevo objeto
// Ejemplo de cómo añadir una nueva lección
Lesson(
title: 'Lección 21: Introducción a Pandas', // Título de tu nueva lección
description: 'Pandas es una librería fundamental para el análisis de datos en Python...', // Descripción general
codeExamples: [
CodeExample(
title: 'Crear un DataFrame', // Título del ejemplo de código
code: """
import pandas as pd
data = {'col1': [1, 2], 'col2': [3, 4]}
df = pd.DataFrame(data)
print(df)
""",
language: 'python', // Asegúrate de que el lenguaje sea 'python'
codeExplanation: 'Este código importa la librería Pandas y crea un DataFrame básico a partir de un diccionario. Luego, imprime el DataFrame resultante en la consola.' // Explicación del código
),
// Puedes añadir más CodeExample si tu lección tiene varios ejemplos
CodeExample(
title: 'Selección de datos',
code: """
# ... (más código de Pandas)
""",
codeExplanation: 'Aquí se muestra cómo seleccionar columnas o filas específicas en un DataFrame.'
),
],
),
// ... y así sucesivamente para cada nueva lección- Guarda el archivo. La próxima vez que ejecutes o hagas un "Hot Restart" de tu aplicación, la nueva lección aparecerá automáticamente en la pantalla principal.
- Manejo de Contenido Grande: Si el curso crece a cientos de lecciones, considerar la carga de contenido desde un archivo JSON local o una base de datos (SQLite, Firebase, etc.) sería más eficiente que tener toda la data en
home_page.dart. - Mejoras de UI/UX:
- Progreso del Usuario: Implementar un sistema para marcar lecciones como completadas.
- Búsqueda: Añadir una barra de búsqueda en
HomePagepara encontrar lecciones. - Personalización: Más opciones de tema, tamaños de fuente, etc.
- Testing: Añadir pruebas unitarias y de widgets para asegurar la robustez de los componentes.
- Internacionalización (i18n): Si se planea que la app esté en varios idiomas, se necesitará implementar el sistema de internacionalización de Flutter.