@@ -29,6 +29,8 @@ typedef PointerBoolFFICallBack = Pointer<Bool> Function( // Usado si delete/clea
2929typedef PointerBoolFFICallBackDirect = Pointer <Bool > Function ( // Usado si clear devuelve Bool sin ID
3030 Pointer <AppDbState >);
3131typedef PointerListFFICallBack = Pointer <Utf8 > Function (Pointer <AppDbState >);
32+ typedef VoidAppDbStateCallBack = Void Function (Pointer <AppDbState >); // Nativo
33+ typedef DartVoidAppDbStateCallBack = void Function (Pointer <AppDbState >); // Dart
3234
3335// Clase simplificada, sin WidgetsBindingObserver
3436class LocalDbBridge extends LocalSbRequestImpl {
@@ -56,19 +58,42 @@ class LocalDbBridge extends LocalSbRequestImpl {
5658 Future <void > initialize (String databaseName) async {
5759 try {
5860 log ('Initializing DB on platform: ${Platform .operatingSystem }' );
61+
62+ // --- LLAMADA A DISPOSE ---
63+ // Intenta cerrar/liberar cualquier instancia nativa previa ANTES de continuar.
64+ await dispose ();
65+ log ('Previous instance disposed (if any).' );
66+ // ------------------------
67+
68+ // Añadir extensión .db si falta
69+ if (! databaseName.contains ('.db' )) {
70+ log ('Adding .db extension to database name.' );
71+ databaseName = '$databaseName .db' ;
72+ }
73+
5974 if (_lib == null ) {
6075 _lib = await CurrentPlatform .loadRustNativeLib ();
76+ if (_lib case Err (error: final err)) {
77+ // Si la carga de la librería falla, lanzar error inmediatamente
78+ throw Exception ("Failed to load native library: $err " );
79+ }
6180 log ('Library loaded: ${_lib }' );
6281 }
82+
83+ // Vincular funciones (esto es seguro llamarlo varias veces si _lib ya existe)
6384 _bindFunctions ();
6485 log ('Functions bound successfully' );
86+
6587 final appDir = await getApplicationDocumentsDirectory ();
6688 log ('Using app directory: ${appDir .path }' );
89+
90+ // Llamar a _init para crear/abrir la nueva instancia
6791 await _init ('${appDir .path }/$databaseName ' );
6892 log ('Database initialized successfully' );
93+
6994 } catch (e, stack) {
7095 log ('Error initializing database: $e \n Stack: $stack ' );
71- // Relanzar para que la app sepa que la inicialización falló
96+ // Relanzar para que el código que llama a initialize (ej. main) sepa del fallo.
7297 rethrow ;
7398 }
7499 }
@@ -87,7 +112,7 @@ class LocalDbBridge extends LocalSbRequestImpl {
87112 late final PointerBoolFFICallBackDirect _clearAllRecords;
88113 // Si devuelven Bool, usa los typedefs comentados abajo y ajusta el lookup y la lógica en los métodos.
89114 // late final PointerBoolFFICallBack _delete;
90- // late final PointerBoolFFICallBackDirect _clearAllRecords ;
115+ late final DartVoidAppDbStateCallBack _closeDatabase ;
91116
92117
93118 // _bindFunctions (adaptado para asumir JSON en delete/clear)
@@ -105,6 +130,8 @@ class LocalDbBridge extends LocalSbRequestImpl {
105130 // Si devuelven Bool, usa esto:
106131 // _delete = lib.lookupFunction<PointerBoolFFICallBack, PointerBoolFFICallBack>(FFiFunctions.delete.cName);
107132 // _clearAllRecords = lib.lookupFunction<PointerBoolFFICallBackDirect, PointerBoolFFICallBackDirect>(FFiFunctions.clearAllRecords.cName);
133+ _closeDatabase = lib.lookupFunction <VoidAppDbStateCallBack , DartVoidAppDbStateCallBack >(FFiFunctions .closeDatabase.cName);
134+
108135 break ;
109136 case Err (error: String error):
110137 log (error);
@@ -472,7 +499,40 @@ class LocalDbBridge extends LocalSbRequestImpl {
472499 return Err (ErrorLocalDb .unknown ('Dart exception during getAll' , originalError: error, stackTrace: stackTrace));
473500 }
474501 }
475- // No hay método dispose
502+
503+
504+ // Método para llamar al cierre nativo
505+ Future <void > dispose () async {
506+ // Verificamos que _dbInstance no sea nullptr ANTES de intentar cerrarla.
507+ // Esto es importante si initialize falló parcialmente o si dispose se llama accidentalmente dos veces.
508+ // Como _dbInstance es `late final`, no puede ser null si initialize tuvo éxito.
509+ // La comprobación principal es contra `nullptr`.
510+ if (_dbInstance != nullptr) {
511+ try {
512+ log ('Calling native close_database...' );
513+ // Llama a la función FFI que acabamos de vincular
514+ _closeDatabase (_dbInstance);
515+ log ('Native close_database called successfully.' );
516+
517+ // ¡Importante! Aunque la memoria nativa se libera, _dbInstance en Dart
518+ // todavía contiene la dirección de memoria (ahora inválida).
519+ // Para evitar usarla accidentalmente, lo IDEAL sería ponerla a null.
520+ // PERO, como es `late final`, no podemos.
521+ // La llamada a dispose() ANTES de _init() en el NUEVO initialize()
522+ // se encargará de obtener una NUEVA instancia válida si es necesario.
523+ // Solo debemos asegurarnos de no usar _dbInstance después de llamar a dispose
524+ // hasta que initialize() la reasigne.
525+
526+ } catch (e, s) {
527+ // Captura errores específicos de FFI si ocurren durante el cierre
528+ log ('Error calling native close_database: $e \n $s ' );
529+ // Podrías decidir si relanzar o solo registrar el error.
530+ // En general, un fallo al cerrar es menos crítico que uno al abrir.
531+ }
532+ } else {
533+ log ('dispose() called but _dbInstance is nullptr (already closed or never initialized?).' );
534+ }
535+ }
476536}
477537
478538
0 commit comments