Hot Reload — una tecnología que permite actualizar el código de una aplicación móvil en ejecución sin reiniciar ni perder el estado actual. El desarrollador modifica el código fuente — en un segundo los cambios aparecen en la pantalla del dispositivo o emulador. Es una característica clave de Flutter y React Native que acelera radicalmente las iteraciones de desarrollo: el tiempo del ciclo edición-visualización se reduce de 5–10 segundos (reconstrucción) a 300–500 milisegundos. Según Flutter Documentation, 2025, hot reload realiza una compilación incremental del código modificado y envía la actualización a Dart VM.
Puntos clave
Hot Reload es un mecanismo de desarrollo mediante el cual el código fuente se modifica y se aplica a una aplicación ya en ejecución sin detenerla. El desarrollador edita un archivo, lo guarda y en 0.3–2 segundos la interfaz actualizada aparece en la pantalla. El estado de la aplicación (contadores, posición de desplazamiento, datos ingresados) se conserva — el desarrollador no pierde el contexto.
El concepto de hot reload se originó en las primeras herramientas web (LiveReload, 2010) y fue adaptado para el desarrollo móvil por Flutter (2017) y React Native (2015). Hoy en día, hot reload es una característica obligatoria de los frameworks móviles modernos, junto con la configuración de depuración y la creación de perfiles. Sin hot reload, el desarrollo de UI se considera ineficiente: cada revisión de cambio requiere 10–30 segundos para reconstrucción e inicio.
Técnicamente, hot reload consta de tres pasos: detección de cambios (file watcher), compilación del código modificado (compilador incremental) y aplicación (hot patching). Cada framework implementa estos pasos de manera diferente, pero el resultado es el mismo: demora mínima entre la edición y la visualización.
Hot Reload en Flutter se basa en la arquitectura de Dart VM y la compilación JIT. Cuando el desarrollador presiona “Hot Reload” en el IDE o guarda un archivo, Flutter realiza una compilación incremental de las bibliotecas Dart modificadas en archivos kernel (.dill). Dart VM carga estos archivos y reemplaza las implementaciones de las funciones modificadas en la aplicación en ejecución.
// Widget con estado de Flutter conservado durante hot reload
class CounterWidget extends StatefulWidget {
@override
State createState() => _CounterState();
}
class _CounterState extends State {
int _counter = 0;
@override
Widget build(BuildContext context) {
return Column(
children: [
Text('Contador: $_counter'),
ElevatedButton(
onPressed: () => setState(() => _counter++),
child: Text('Incrementar'),
),
],
);
}
}
En el ejemplo, el StatefulWidget CounterWidget conserva el campo _counter durante hot reload. Dart VM recrea el estado (State), llamando a reassemble(), pero no restablece _counter — el valor se conserva a menos que el widget se recree por completo. Flutter llama a reassemble() para todos los objetos State, y build() se ejecuta nuevamente con el código actualizado y el estado conservado.
Cuando hot reload no funciona: si se ha modificado una variable de inicialización estática (static const), una variable global, main(), una declaración de clase enum/mixin o código en @override initState(). En estos casos se requiere Hot Restart. Según Flutter Team (2025), hot reload tiene éxito en el 85–90% de los casos; el 10–15% de los cambios requieren un reinicio completo.
Dart VM en modo depuración funciona como un compilador JIT: interpreta el código Dart a través del formato kernel (análogo al bytecode). Hot reload carga un nuevo archivo kernel y reemplaza las definiciones de funciones antiguas. La VM no reinicia los isolates — todas las operaciones asíncronas (Future, Stream) continúan ejecutándose. En modo release, Dart se compila AOT (dart2native) y hot reload no está disponible.
Fast Refresh (anteriormente Hot Reloading) en React Native utiliza Metro bundler — un empaquetador de módulos JavaScript que monitorea los cambios de archivos. Cuando el desarrollador guarda un archivo, Metro compila solo el módulo modificado (HMR — Hot Module Replacement) y envía la actualización a través de WebSocket a la aplicación en ejecución.
// Componente de React Native con conservación de estado durante hot reload
import React, { useState } from 'react';
import { View, Text, Button } from 'react-native';
const Counter = () => {
const [count, setCount] = useState(0);
return (
<View>
<Text>Contador: {count}Text>
<Button title="Incrementar"
onPress={() => setCount(c => c + 1)} />
View>
);
};
Fast Refresh conserva el estado de React (useState, useReducer) al actualizar el módulo. Metro HMR transmite solo el diff del módulo modificado — no todo el bundle. React Native utiliza React Fast Refresh, desarrollado por el equipo de React (Dan Abramov, 2019): genera un nuevo render para el componente pero conserva los estados de los hooks y las props si la firma del componente no ha cambiado.
Fast Refresh no funciona al cambiar: exportación de componentes, hooks (useEffect, useMemo), dependencias de módulos y módulos nativos (Java/Objective-C). Dichos cambios requieren Reload (recarga completa del bundle JS) o Rebuild (reconstrucción del código nativo). El tiempo de fast refresh es de 200–800 ms, el reload completo es de 2–5 segundos.
Hot Reload y Hot Restart son dos modos de actualización de código con diferentes casos de uso. Hot Reload es adecuado para cambios de UI (estilos, diseño, colores, textos), cuando la estructura de clases y el tipo de estado no cambian. Hot Restart es necesario al cambiar firmas de métodos, agregar nuevos widgets/componentes al árbol raíz, modificar initState y módulos nativos.
| Característica | Hot Reload | Hot Restart |
|---|---|---|
| Velocidad | 0.3–2 segundos | 2–10 segundos |
| Conservación de estado | Sí (variables, state, pila de navegación) | No (la aplicación se inicia de nuevo) |
| Compilación | Incremental (solo cambios) | Recompilación completa de Dart/JS |
| Cuándo usar | Ajustes de UI, estilos, textos, layout | Cambios estructurales, nuevos módulos, código nativo |
| Flutter | Hot Reload (R) | Hot Restart (Shift + R) |
| React Native | Fast Refresh | Reload (Cmd + R) |
Estrategia recomendada: comenzar con hot reload. Si los cambios no se aplican (el IDE muestra “Reload needed”) — realizar hot restart. En Flutter, el icono del botón cambia: rayo (⚡) para hot reload, rayo tachado si se requiere restart. La eficiencia del desarrollo con hot reload es 40–60% mayor en comparación con las reconstrucciones completas (datos de JetBrains Developer Survey 2024).
Inyección de código (code injection) es el mecanismo general de hot reload utilizado por todos los frameworks. Incluye tres fases. Primera — detección de cambios: un file watcher (integrado en el IDE) o el sistema de archivos (FSNotify) detecta un cambio en un archivo .dart, .js, .tsx. Segunda — compilación: el compilador incremental transforma solo el archivo modificado en una representación intermedia (kernel .dill para Dart, HMR-module para JS). Tercera — aplicación: el nuevo código se envía al dispositivo y reemplaza las definiciones antiguas en la memoria de la aplicación en ejecución.
Reemplazo en caliente de funciones (hot patching) es una técnica en la que el runtime reemplaza el puntero a la función en la tabla de métodos virtuales. Dart VM utiliza ClassTable — una estructura interna que contiene todas las clases cargadas. Durante hot reload, la VM encuentra la clase en ClassTable y reemplaza sus definiciones de funciones por las nuevas del archivo kernel. Todas las instancias existentes de la clase obtienen automáticamente el nuevo comportamiento.
// Flutter: callback reassemble para gestionar el estado después de hot reload
class MyWidget extends StatefulWidget {
@override
State createState() => _MyState();
}
mixin ReloadAware on State {
@override
void reassemble() {
super.reassemble();
// Restablecer caché o datos después de hot reload
clearCache();
}
}
En el ejemplo, el mixin ReloadAware sobrescribe el método reassemble(), que Dart VM llama en cada objeto State después de hot reload. El desarrollador puede restablecer la caché, reinicializar recursos o realizar una migración de estado. Sin este método, los datos antiguos pueden permanecer en la caché y causar inconsistencias después de la actualización de widgets.
El reemplazo en caliente no funciona para cambios que requieren reasignación de memoria para nuevos campos, cambio de tipo de variable en una clase, adición de nuevos campos en StatefulWidget, cambio de valores de enum o parámetros genéricos. Estos cambios son incompatibles con los objetos existentes en memoria — Dart VM no puede “barajar” campos en objetos ya asignados. Para estos casos se requiere hot restart o una reconstrucción completa.
El desarrollo nativo de Android e iOS tradicionalmente no tiene hot reload completo. Android Studio con Android 11+ y AGP 4.2+ admite Apply Changes: actualización de código sin reiniciar la aplicación. Apply Changes funciona a través de Android Runtime (ART) — reemplaza las implementaciones de métodos en archivos dex sobre la marcha. Sin embargo, Apply Changes es limitado: no funciona para cambios de recursos (layout.xml, drawable), manifiesto y bibliotecas nativas.
Apple presentó Previews (SwiftUI Preview) en Xcode 15 (2023) — esto no es hot reload en el sentido clásico. Previews compila la sección de vista previa por separado de la aplicación principal y muestra el resultado en el canvas de Xcode. Al guardar un archivo, la vista previa se actualiza en 1–3 segundos, pero el estado de la aplicación no se conserva. Para proyectos UIKit, hot reload está disponible a través de herramientas de terceros: InjectionIII (John Holdsworth) y SwiftHotReload.
Kotlin Multiplatform (KMP) recibió soporte experimental de hot reload de JetBrains a partir de 2024. El mecanismo se basa en Kotlin/Native runtime con reemplazo de funciones en el archivo objeto (.klib). JetBrains Compose Multiplayer utiliza su propia implementación de hot reload, similar a Flutter: compilación incremental y reemplazo de clases en Kotlin/Native runtime. La velocidad es de 1–3 segundos, disponible solo para cambios de UI.
Apply Changes es un mecanismo de Android Studio que utiliza la API de ART runtime. Al guardar código, Android Studio determina qué clases han cambiado y envía sus archivos dex al dispositivo a través de adb. ART reemplaza las implementaciones de métodos en la aplicación en ejecución sin detenerla. Apply Changes funciona en tres modos: Instant Run (reemplazo rápido de método), Swap (reemplazo de clase con recreación de instancias) y Restart Activity (si los cambios son incompatibles con el estado actual).
Preguntas frecuentes
Hot Reload actualiza el código sin reiniciar la aplicación y conserva el estado. Live Reload recarga toda la aplicación o página web al cambiar archivos. Live Reload es más simple de implementar, pero más lento y pierde el estado. Flutter y React Native usan hot reload; las herramientas web usan live reload.
Hot Reload no funciona para cambios que requieren reasignación de memoria (nuevos campos de clase), cambios de constantes estáticas (static const), renombramiento de widgets, cambios de enum o parámetros genéricos. Estos cambios son incompatibles con los objetos existentes en la memoria de Dart VM o JavaScript runtime.
Sí, hot reload funciona tanto en dispositivos físicos como en emuladores. Flutter envía archivos kernel al dispositivo a través de USB (adb forward) o Wi-Fi. React Native usa WebSocket a través de Metro bundler. La demora en un dispositivo físico suele ser 10–30% mayor que en un emulador.
Xcode Previews (desde 2021) es un análogo de hot reload para SwiftUI, pero con limitaciones: las vistas previas se compilan por separado, no admiten navegación por la aplicación ni estados complejos. Apple no proporciona un hot reload oficial para iOS. Herramientas de terceros: InjectionIII y SwiftHotReload usan Objective-C Runtime para inyección de código.
Si la UI se muestra incorrectamente después de hot reload: realiza un hot restart. Si el problema está en los datos — verifica el callback reassemble() en Flutter o useEffect cleanup en React Native. Para problemas persistentes, usa Flutter Clean o Reset Metro Cache. Si un error se reproduce solo después de reload — es señal de incompatibilidad de los cambios con el estado existente.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también