main function
Punto de entrada de la aplicación Klinico.
Configura el árbol de inyección de dependencias mediante MultiProvider: repositorios, servicios y ViewModels necesarios para toda la app. El ApiClient incluye un interceptor 401 que redirige al login cuando el token JWT caduca durante una sesión activa.
Implementation
void main() {
runApp(
MultiProvider(
providers: [
Provider(create: (_) => const FlutterSecureStorage()),
Provider(
create: (context) => ApiClient(
getToken: () =>
context.read<FlutterSecureStorage>().read(key: 'token'),
// Callback (interceptor) que se invoca cuando la API devuelve 401 durante una sesión activa (token caducado en mitad del uso).
onUnauthorized: () {
// Capa 2: el token caducó durante la sesión → limpiar y redirigir
final context = navigatorKey.currentContext;
if (context != null) {
context.read<LoginViewModel>().signOut();
}
navigatorKey.currentState?.pushAndRemoveUntil(
MaterialPageRoute(builder: (_) => const LoginPage()),
(route) => false,
);
},
),
),
Provider(
create: (context) => AuthRepository(context.read<ApiClient>()),
),
Provider(
create: (context) => AdmissionRepository(context.read<ApiClient>()),
),
Provider(
create: (context) => EpisodeRepository(context.read<ApiClient>()),
),
Provider(
create: (context) => PatientRepository(context.read<ApiClient>()),
),
Provider(
create: (context) => ServiceRepository(context.read<ApiClient>()),
),
Provider(
create: (context) => UserRepository(context.read<ApiClient>()),
),
Provider(
create: (context) => KpisRepository(context.read<ApiClient>()),
),
Provider(
create: (context) => AuthService(
authRepository: context.read<AuthRepository>(),
storage: context.read<FlutterSecureStorage>(),
),
),
ChangeNotifierProvider(
create: (context) =>
LoginViewModel(authService: context.read<AuthService>()),
),
ChangeNotifierProvider(
create: (context) => AdmissionViewModel(
repository: context.read<AdmissionRepository>(),
),
),
ChangeNotifierProvider(
create: (context) =>
EpisodeViewModel(repository: context.read<EpisodeRepository>()),
),
ChangeNotifierProvider(
create: (context) =>
WorkloadViewmodel(repository: context.read<UserRepository>()),
),
ChangeNotifierProvider(
create: (context) =>
KpisViewModel(repository: context.read<KpisRepository>()),
),
],
child: const MyApp(),
),
);
}