Saltar al contenido principal
Versión: 0.80
Traducción Beta No Oficial

Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →

Ciclo de vida de los Native Modules

En React Native, los Native Modules son singleton. La infraestructura de Native Modules crea un módulo de forma diferida la primera vez que se accede a él y lo mantiene disponible siempre que la aplicación lo necesite. Esta optimización de rendimiento evita la sobrecarga de crear Native Modules de manera anticipada al inicio de la app, garantizando tiempos de arranque más rápidos.

En una aplicación pura de React Native, los Native Modules se crean una vez y nunca se destruyen. Sin embargo, en aplicaciones más complejas, puede haber casos de uso donde los Native Modules se destruyan y vuelvan a crearse. Imagina, por ejemplo, una aplicación brownfield que combina vistas nativas con superficies de React Native, como se presenta en la guía de Integración con aplicaciones existentes. En ese caso, podría tener sentido destruir una instancia de React Native cuando el usuario navega fuera de una superficie de React Native y recrearla cuando regresa a esa superficie.

Cuando esto ocurre, los Native Modules sin estado (stateless) no causan problemas. Sin embargo, para los Native Modules con estado (stateful), puede ser necesario invalidar el módulo correctamente para garantizar que el estado se restablezca y se liberen los recursos.

En esta guía, explorarás cómo inicializar e invalidar un Native Module correctamente. Asumimos que estás familiarizado con cómo escribir Native Modules y te sientes cómodo escribiendo código nativo. Si no conoces los Native Modules, lee primero la guía de Native Modules.

Android

En Android, todos los Native Modules implementan una interfaz TurboModule que define dos métodos: initialize() e invalidate().

El método initialize() es llamado por la infraestructura cuando se crea el Native Module. Es el mejor lugar para el código de inicialización que necesita acceso al ReactApplicationContext. Estos Native Modules del núcleo implementan initialize(): BlobModule, NetworkingModule.

El método invalidate() es llamado cuando se destruye el Native Module. Es el mejor lugar para el código de limpieza: restablecer el estado del módulo y liberar recursos innecesarios como memoria y archivos. Estos Native Modules del núcleo implementan invalidate(): DeviceInfoModule, NetworkModule

iOS

En iOS, los Native Modules se ajustan al protocolo RCTTurboModule. Sin embargo, este protocolo no expone los métodos initialize e invalidate presentes en la clase TurboModule de Android.

En cambio, en iOS existen dos protocolos adicionales: RCTInitializing y RCTInvalidating. Estos protocolos se utilizan para definir los métodos initialize e invalidate, respectivamente.

Si tu módulo necesita ejecutar código de inicialización, puedes adoptar el protocolo RCTInitializing e implementar el método initialize. Para hacerlo, debes:

  1. Modificar el archivo NativeModule.h agregando estas líneas:
NativeModule.h
+ #import <React/RCTInitializing.h>

//...

- @interface NativeModule : NSObject <NativeModuleSpec>
+ @interface NativeModule : NSObject <NativeModuleSpec, RCTInitializing>
//...
@end
  1. Implementar el método initialize en el archivo NativeModule.mm:
NativeModule.mm
// ...

@implementation NativeModule

+- (void)initialize {
+ // add the initialization code here
+}

@end

Estos son algunos módulos nativos del núcleo que implementan el método initialize: RCTBlobManager, RCTTiming.

Si tu módulo necesita ejecutar código de limpieza, puedes adoptar el protocolo RCTInvalidating e implementar el método invalidate. Para hacerlo, debes:

  1. Modificar el archivo NativeModule.h agregando estas líneas:
NativeModule.h
+ #import <React/RCTInvalidating.h>

//...

- @interface NativeModule : NSObject <NativeModuleSpec>
+ @interface NativeModule : NSObject <NativeModuleSpec, RCTInvalidating>

//...

@end
  1. Implementar el método invalidate en el archivo NativeModule.mm:
NativeModule.mm

// ...

@implementation NativeModule

+- (void)invalidate {
+ // add the cleanup code here
+}

@end

Estos son algunos módulos nativos del núcleo que implementan el método invalidate: RCTAppearance, RCTDeviceInfo.