Extensión DevTools
get_it incluye una extensión de DevTools que te permite visualizar e inspeccionar todos los objetos registrados en tu app Flutter en ejecución en tiempo real.
Características clave:
- ✅ Ver todos los registros - Ve cada objeto registrado en `get_it` a través de todos los scopes
- ✅ Inspeccionar estado de instancia - Ve la salida de toString() de instancias creadas
- ✅ Rastrear detalles de registro - Tipo, scope, modo, estado async, estado ready, estado de creación
- ✅ Actualizaciones en tiempo real - Se refresca automáticamente cuando los registros cambian (con eventos de depuración habilitados)
Configuración
1. Habilita Eventos de Depuración
En el main.dart de tu app, habilita los eventos de depuración antes de ejecutar tu app:
void main() {
GetIt.instance.debugEventsEnabled = true;
// ... configura tus dependencias
configureDependencies();
runApp(MyApp());
}¿Por Qué Habilitar Eventos de Depuración?
Cuando debugEventsEnabled es true, get_it envía eventos a DevTools cada vez que los registros cambian, permitiendo que la extensión se actualice automáticamente. Sin esto, necesitarás refrescar manualmente la extensión para ver cambios.
Solo Modo Debug
La extensión DevTools solo funciona en modo debug. En builds de release, la extensión no está disponible y los eventos de depuración no tienen efecto.
2. Ejecuta Tu App en Modo Debug
flutter run3. Abre DevTools en el Navegador
La extensión de get_it actualmente solo funciona en DevTools basado en navegador, no en DevTools embebido en IDE.
Cuando ejecutes tu app, Flutter mostrará un mensaje como:
The Flutter DevTools debugger and profiler is available at: http://127.0.0.1:9100Abre esa URL en tu navegador.
4. Habilita la Extensión
- En DevTools, haz clic en el botón Extensions (ícono de pieza de rompecabezas) en la esquina superior derecha
- Encuentra la extensión
get_iten la lista y habilítala - La pestaña "get_it" aparecerá en la navegación principal de DevTools
5. Abre la Pestaña get_it
Haz clic en la pestaña "get_it" para ver todos tus registros.
Entendiendo la Tabla de Registros
La extensión DevTools muestra todos los objetos registrados en una tabla con las siguientes columnas:
La extensión DevTools de get_it mostrando todos los objetos registrados en una app en ejecución
| Columna | Descripción |
|---|---|
| Type | El tipo registrado (nombre de clase) |
| Instance Name | El nombre de instancia si se usan registros con nombre, de lo contrario vacío |
| Scope | El scope al que pertenece este registro (ej., baseScope para el scope por defecto) |
| Mode | El tipo de registro: constant (singleton), lazy (lazy singleton), alwaysNew (factory), o cachedFactory |
| Async | Si este es un registro async (true para registerSingletonAsync y registerLazySingletonAsync) |
| Ready | Para registros async, si la inicialización está completa |
| Created | Si la instancia ha sido creada (false para registros lazy que no han sido accedidos aún) |
| Instance Details | La salida de toString() de la instancia (si está creada) |
Haciendo los Detalles de Instancia Significativos
Por defecto, el toString() de Dart solo muestra el nombre del tipo e ID de instancia (ej., Instance of 'UserRepository'). Para ver detalles significativos en la extensión DevTools, sobrescribe toString() en tus clases registradas:
class UserRepository {
final String userId;
final bool isAuthenticated;
UserRepository(this.userId, this.isAuthenticated);
@override
String toString() {
return 'UserRepository(userId: $userId, isAuthenticated: $isAuthenticated)';
}
}Ahora en DevTools, verás:
UserRepository(userId: user123, isAuthenticated: true)Consejos para Buenas Implementaciones de toString()
- ✅ Incluye estado clave - Muestra las propiedades más importantes que te ayudan a entender el estado actual del objeto
- ✅ Mantenlo conciso - Strings largos son difíciles de leer en la tabla. Limítate a la información esencial
- ✅ Usa nombres descriptivos - Haz obvio qué representa cada valor
- ✅ Incluye estados enum - Si tu objeto tiene estados o modos, inclúyelos
Ejemplo para un reproductor de medios:
class PlayerManager {
bool isPlaying;
String? currentTrack;
Duration position;
Duration duration;
@override
String toString() {
final posStr = '${position.inMinutes}:${(position.inSeconds % 60).toString().padLeft(2, '0')}';
final durStr = '${duration.inMinutes}:${(duration.inSeconds % 60).toString().padLeft(2, '0')}';
return 'PlayerManager('
'playing: $isPlaying, '
'track: ${currentTrack ?? 'none'}, '
'position: $posStr/$durStr'
')';
}
}Esto muestra: PlayerManager(playing: true, track: My Song, position: 2:34/4:15)
Refrescando la Vista
- Con eventos de depuración habilitados: La vista se actualiza automáticamente cuando los registros cambian
- Sin eventos de depuración: Haz clic en el botón Refresh en la extensión para actualizar manualmente la vista
- Refresco manual: Siempre puedes hacer clic en Refresh para asegurar que estás viendo el estado más reciente
Solución de Problemas
La pestaña get_it no aparece
- ➜ Asegúrate de estar usando DevTools basado en navegador, no DevTools embebido en IDE
- ➜ Verifica que la extensión esté habilitada en el menú Extensions (ícono de pieza de rompecabezas)
- ➜ Asegura que tu app esté ejecutándose en modo debug
La extensión no muestra registros
- ➜ Asegúrate de haber registrado objetos realmente en tu app
- ➜ Haz clic en el botón Refresh para actualizar manualmente la vista
- ➜ Verifica que estés viendo la instancia correcta de DevTools para tu app en ejecución
La extensión no se auto-actualiza
- ➜ Verifica que
debugEventsEnabled = trueesté establecido antes de cualquier registro - ➜ Usa el botón Refresh manual si las actualizaciones automáticas no funcionan
Casos de Uso
Durante el Desarrollo
- Verificar registros - Asegura que todos los servicios requeridos están registrados al inicio
- Depurar inicialización - Verifica qué async singletons están ready
- Inspeccionar estado - Ve el estado actual de tus servicios y modelos
- Entender scopes - Ve qué objetos pertenecen a qué scope
Durante las Pruebas
- Verificar configuración de prueba - Asegura que los mocks están registrados correctamente
- Depurar pruebas inestables - Verifica si los objetos se están creando múltiples veces
- Aislamiento de scope - Verifica que los scopes de prueba funcionan como se espera
Durante la Depuración
- Rastrear bugs - Inspecciona el estado del servicio cuando ocurren bugs
- Verificar ciclo de vida - Verifica si los lazy singletons se crean cuando se espera
- Monitorear cambios - Observa cómo cambian los registros mientras navegas tu app
Aprende Más
- Pruebas con get_it - Aprende cómo probar tus registros de
get_it - Scopes - Entiende cómo funcionan los scopes
- Objetos Asíncronos - Aprende sobre inicialización async
- Documentación Oficial de Flutter DevTools