es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Eliminar Flutter Hive no funciona en el controlador de mensajes en segundo plano de Firebase.

La eliminación de Hive no funciona cuando la aplicación recibe una notificación push en estado de segundo plano o terminado. Estoy utilizando el siguiente código.

FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
.
.
//few lines of code
.
.


Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async { 
  if (Platform.isAndroid || Platform.isIOS) {
    final Directory appDocDirectory =
        await getApplicationDocumentsDirectory();
    globals.hiveBoxesPath = appDocDirectory.path + '/boxes';
    Hive.init(globals.hiveBoxesPath);
  }
  BoxConstants.registerHiveAdapters();
   String mappingId = '';
    if (message.isNotEmpty && message.containsKey('data')) {
      final data = message['data'];
      final otherData =
          data.containsKey('other') ? json.decode(data['other']) : null;
      mappingId = otherData != null && otherData.containsKey('mapping_id')
          ? otherData['mapping_id'].toString()
          : mappingId;
    } else {
      final otherData =
          message.containsKey('other') ? json.decode(message['other']) : null;
      mappingId = otherData != null && otherData.containsKey('mapping_id')
          ? otherData['mapping_id'].toString()
          : mappingId;
    }
 //---- EDIT
    if (mappingId.isNotEmpty) {
  final String name = (OrgMemberUserBox).toString();
  if (Hive.isBoxOpen(name)) {
    Hive.box(name).close();
  }
  await HiveDbManager.openBox<orgmemberuserbox>().then((box) async {
    await box.delete(mappingId);
  });
}
}

El método anterior se llama cuando el dispositivo recibe una notificación. Estoy intentando eliminar por la clave mappingId pero no está funcionando.

¿Alguna solución para esto?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está relacionado con que Hive no puede eliminar datos cuando la aplicación está en segundo plano o en estado terminado mientras recibe notificaciones. Una posible solución alternativa es intentar abrir la caja de Hive antes de eliminar los datos. Aquí hay una versión editada del código que podría funcionar:

    if (mappingId.isNotEmpty) {
      final String name = (OrgMemberUserBox).toString();
      if (Hive.isBoxOpen(name)) {
        // cerrar y volver a abrir la caja podría ayudar
        Hive.box(name).close();
      }
      // abrir la caja explícitamente antes de eliminar
      await HiveDbManager.openBox<orgmemberuserbox>().then((box) async {
        await box.delete(mappingId);
      });
    }
    

    Al cerrar y volver a abrir la caja y abrirla explícitamente antes de eliminar, podríamos solucionar el problema. Sin embargo, si el problema persiste, podría haber otros problemas subyacentes que deben resolverse.

Comments are closed.