Hot Restart es un mecanismo de recarga rápida de una aplicación móvil durante el desarrollo, en el que la aplicación se reinicia completamente con el código fuente actualizado. A diferencia de una recompilación completa, Hot Restart utiliza código binario ya compilado y solo recarga la Dart VM, reduciendo el tiempo del ciclo de desarrollo. Según la documentación de Flutter (2025), un Hot Restart típico toma de 1 a 3 segundos. Hot Restart es especialmente útil cuando se cambia el estado global de la aplicación y el código de inicialización.
Puntos clave
Hot Restart es un mecanismo de desarrollo en el que la aplicación se recarga completamente con el código fuente actualizado sin necesidad de una recompilación completa del proyecto. El desarrollador realiza cambios en el código, guarda el archivo y envía un comando de reinicio a través del IDE. La aplicación recompila los archivos modificados, reinicia la Dart VM y recorre todo el ciclo de vida desde main hasta el renderizado final de la interfaz de usuario.
Hot Restart se diferencia de una reconstrucción completa en que utiliza bibliotecas binarias ya compiladas y el framework Flutter sin recompilar los wrappers nativos. Esto reduce el tiempo del ciclo de desarrollo de varios minutos a varios segundos. Según una encuesta de desarrolladores Flutter (2024), el tiempo medio de Hot Restart es de 2.1 segundos, aproximadamente un 97% más rápido que una reconstrucción completa del proyecto mediante el comando flutter build.
El mecanismo es especialmente demandado al desarrollar interfaces de usuario que requieren una comprobación frecuente de cambios visuales. El desarrollador puede cambiar el color, tamaño o posición de un elemento y ver instantáneamente el resultado en un simulador o dispositivo físico sin perder el contexto de desarrollo por una compilación prolongada. Esto acelera radicalmente la creación iterativa de prototipos.
Al ejecutar un comando Hot Restart, ocurre una secuencia de operaciones: guardar los archivos modificados, compilación incremental de los archivos Dart modificados en código máquina, reinicio de la Dart VM y reejecución del punto de entrada de la aplicación. La Dart VM es una máquina virtual que ejecuta código Dart en modo JIT (Just-In-Time) durante el desarrollo y AOT (Ahead-Of-Time) en las compilaciones de producción.
Durante Hot Restart, la aplicación pasa por un ciclo de vida completo: llamada a la función main, inicialización de WidgetsFlutterBinding, ejecución de runApp y construcción de todo el árbol de widgets desde cero. Todos los estados anteriores de widgets, variables y cachés se eliminan. Esto garantiza que la aplicación esté en un estado limpio, completamente idéntico al estado posterior a una instalación nueva en el dispositivo.
El proceso se puede representar como una secuencia de pasos: el desarrollador presiona el botón Hot Restart en el IDE, el conjunto de herramientas de Flutter envía un comando al dispositivo, el dispositivo guarda el esqueleto de la aplicación actual, reinicia la Dart VM con el nuevo código y vuelve a ejecutar main. Todas las dependencias registradas en el contenedor de inyección de dependencias se recrean desde cero.
Una característica clave es que el código binario de la capa nativa (plugins, código Kotlin, código Swift) no se recompila. Hot Restart solo afecta la capa Dart de la aplicación, lo que garantiza la alta velocidad de reinicio. Si los cambios afectan al código nativo, se requiere un flutter build completo.
Flutter utiliza una arquitectura donde el código Dart se ejecuta en la Dart VM y la interfaz de usuario se renderiza a través del motor Skia o Impeller. Durante Hot Restart, el conjunto de herramientas de Flutter reinicia una instancia aislada de la Dart VM (isolate), carga los archivos .dill actualizados (Dart Intermediate Language) y vuelve a ejecutar la función main. Toda la interfaz de usuario se reconstruye desde cero mediante la llamada runApp, lo que garantiza que todos los widgets estén actualizados.
import 'package:flutter/material.dart';
void main() {
// Después de Hot Restart, esta función se ejecuta de nuevo
var prefs = await SharedPreferences.getInstance();
var themeMode = prefs.getString('theme') ?? 'light';
runApp(MyApp(themeMode: themeMode));
}
Hot Restart y Hot Reload son dos mecanismos de desarrollo rápido que a menudo se confunden. Hot Reload carga los cambios en la aplicación en ejecución sin perder el estado actual, mientras que Hot Restart reinicia completamente la aplicación. Hot Reload funciona más rápido (0.1–1 segundo) pero no aplica cambios que afecten la inicialización o los campos estáticos de clase.
La principal diferencia es el estado de la aplicación. Hot Reload preserva el estado actual de los widgets: posición de desplazamiento, datos ingresados, ventanas modales abiertas. Hot Restart restablece todo el estado al inicial. Si el cambio solo afecta el código en el método build, Hot Reload es suficiente. Si el cambio afecta a main, variables globales o dependencias, se requiere Hot Restart.
Hot Reload aplica cambios inyectando código actualizado en la Dart VM sin reiniciar el isolate. Esto solo es posible para cambios que no rompan la estructura de tipos y no requieran reinicialización de widgets. Durante Hot Restart, el isolate se reinicia completamente, lo que permite aplicar cualquier cambio, incluida la eliminación o renombrado de clases y métodos.
Según el equipo de Flutter, Hot Reload toma menos de 1 segundo para la mayoría de los cambios, mientras que Hot Restart toma de 1 a 3 segundos. Para aproximadamente el 80% de los cambios de interfaz de usuario, Hot Reload es suficiente. Hot Restart es necesario al cambiar configuraciones de la aplicación, variables globales, plugins nativos en el wrapper Dart y decisiones arquitectónicas.
Se recomienda la siguiente estrategia: use Hot Reload para ediciones visuales de la UI y cambios menores de lógica; cambie a Hot Restart al modificar estructuras de datos, agregar dependencias o editar código de inicialización. Esto minimiza el tiempo de espera y mantiene una alta productividad de desarrollo.
El mecanismo de reinicio en caliente se implementa de manera diferente según el framework y el lenguaje de programación. Flutter proporciona la implementación más madura de Hot Restart a través de la compilación JIT de la Dart VM, mientras que React Native utiliza un mecanismo similar a través de Metro Bundler y JavaScript Core o Hermes.
En Flutter, Hot Restart se activa con el comando r en la terminal después de iniciar la aplicación mediante flutter run. Alternativamente, use el botón Hot Restart en Android Studio, VS Code o IntelliJ IDEA. Hot Restart solo funciona en modo debug y no está disponible en compilaciones profile y release. Al ejecutarse, el conjunto de herramientas de Flutter recompila los archivos modificados en formato kernel y los envía al dispositivo.
// Antes de Hot Restart: versión anterior
class Counter extends StatefulWidget {
final int initialValue = 0;
// Después de Hot Restart: el nuevo valor entrará en vigor
// final int initialValue = 10;
}
class CounterState extends State<Counter> {
int _count = 0;
// Hot Reload conserva _count, Hot Restart lo restablece a 0
}
Una limitación de Hot Restart en Flutter es la imposibilidad de preservar el estado de depuración. Después del reinicio, todos los puntos de interrupción se conservan, pero los valores de las variables en el depurador se restablecen. Para preservar el estado entre reinicios, se utiliza el mecanismo State Restoration.
En React Native, el reinicio en caliente se implementa a través de Metro Bundler, un empaquetador de módulos JavaScript. Cuando el código cambia, Metro reconstruye los módulos modificados y envía el bundle actualizado al dispositivo. React Native admite Fast Refresh, un análogo de Hot Reload que preserva el estado de los componentes funcionales mediante hooks de React.
Un reinicio completo (Reload) en React Native recarga el motor JavaScript y toda la aplicación en su conjunto. Esto es totalmente análogo a Hot Restart en Flutter. Para activarlo, use Cmd+R en el simulador de iOS o presione R dos veces en Android. El tiempo de reinicio completo en React Native varía de 2 a 8 segundos según el tamaño del bundle.
Hot Restart es una herramienta indispensable en varios escenarios de desarrollo. El primero y más obvio es cambiar la configuración global de la aplicación: temas, localización, proveedores de estado. Si cambió un proveedor en la raíz del árbol de widgets o agregó un nuevo módulo al contenedor DI, Hot Restart garantiza la inicialización correcta de todos los componentes.
El segundo escenario es cambiar variables estáticas y constantes. En Dart, los campos estáticos se inicializan una vez cuando se carga la clase. Hot Reload no aplica cambios a los campos estáticos, por lo que se requiere Hot Restart para actualizarlos. Esto es especialmente relevante al trabajar con constantes de configuración, URL de API y flags de funcionalidades.
El tercer escenario es la depuración de inicialización: verificación del funcionamiento de la función main, pantalla de presentación, carga de dependencias. Con cada Hot Restart, la aplicación pasa por un ciclo de inicialización completo, lo que permite identificar errores que ocurren solo al inicio — problemas con SharedPreferences, errores de conexión a la base de datos, tiempos de espera de inicialización.
El cuarto escenario es probar el estado vacío. Hot Restart restablece todo el estado de la aplicación, lo que permite verificar el comportamiento en el primer inicio: visualización del tutorial, solicitud de permisos, listas vacías y pantallas de marcador de posición. Para pruebas repetibles, esto es significativamente más rápido que reinstalar la aplicación.
Preguntas frecuentes
Hot Restart reinicia completamente la aplicación y la Dart VM, restableciendo el estado al inicial. Hot Reload inyecta cambios en la aplicación en ejecución, preservando el estado actual de la UI. Hot Reload es más rápido pero no se puede usar para cambios de inicialización y variables globales.
En la terminal después de iniciar flutter run, presione la tecla R (Shift+R) para Hot Restart. En Android Studio o VS Code, use el botón Hot Restart en el panel de depuración. El comando solo está disponible en modo debug.
Un Hot Restart típico toma de 1 a 3 segundos para proyectos de tamaño mediano. El tiempo depende de la cantidad de archivos Dart, la complejidad del árbol de widgets y el rendimiento del dispositivo. Para proyectos grandes, el tiempo puede alcanzar 5–8 segundos.
No, Hot Restart solo está disponible en modo debug. Las compilaciones release y profile utilizan compilación AOT, que no admite recarga en caliente. Para actualizar el código en release, se requiere una reconstrucción completa.
Hot Restart no afecta el código nativo — plugins Kotlin, Swift o Java. Si se realizan cambios en el código nativo del plugin, se requiere una reconstrucción completa del proyecto. Hot Restart solo es efectivo para la capa Dart de la aplicación.
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