Ta strona została przetłumaczona przez PageTurner AI (beta). Nie jest oficjalnie zatwierdzona przez projekt. Znalazłeś błąd? Zgłoś problem →
Cykl życia modułów natywnych
W React Native moduły natywne mają charakter singletonów. Infrastruktura modułów tworzy moduł leniwie (lazy) przy pierwszym dostępie i przechowuje go, gdy tylko aplikacja tego wymaga. Jest to optymalizacja wydajnościowa pozwalająca uniknąć narzutu związanego z wczesnym tworzeniem modułów podczas uruchamiania aplikacji, co zapewnia szybsze czasy startu.
W czystej aplikacji React Native moduły natywne są tworzone raz i nigdy nie są niszczone. Jednak w bardziej złożonych aplikacjach mogą wystąpić przypadki, gdy moduły są niszczone i odtwarzane. Wyobraź sobie np. aplikację typu brownfield łączącą natywne widoki z powierzchniami React Native, jak opisano w przewodniku integracji z istniejącymi aplikacjami. W takim przypadku może być zasadne zniszczenie instancji React Native po opuszczeniu jej powierzchni i odtworzenie jej po powrocie użytkownika.
Gdy moduły bezstanowe (stateless) nie powodują problemów, moduły ze stanem (stateful) mogą wymagać poprawnego unieważnienia, aby zapewnić reset stanu i zwolnienie zasobów.
W tym przewodniku poznasz, jak poprawnie inicjować i unieważniać moduł natywny. Zakładamy, że znasz podstawy tworzenia modułów natywnych i swobodnie piszesz kod natywny. Jeśli nie znasz modułów natywnych, przeczytaj najpierw przewodnik po modułach natywnych.
Android
W przypadku Androida wszystkie moduły natywne implementują interfejs TurboModule, który definiuje dwie metody: initialize() i invalidate().
Metoda initialize() jest wywoływana przez infrastrukturę modułów podczas tworzenia modułu. To najlepsze miejsce na umieszczenie kodu inicjalizującego wymagającego dostępu do np. ReactApplicationContext. Oto przykłady modułów z rdzenia implementujących initialize(): BlobModule, NetworkingModule.
Metoda invalidate() jest wywoływana podczas niszczenia modułu. To idealne miejsce na umieszczenie kodu sprzątającego, resetującego stan modułu i zwalniającego niepotrzebne zasoby jak pamięć czy pliki. Oto przykłady modułów implementujących invalidate(): DeviceInfoModule, NetworkModule
iOS
W iOS moduły natywne zgodne są z protokołem RCTTurboModule. Jednak ten protokół nie udostępnia metod initialize i invalidate obecnych w klasie TurboModule dla Androida.
Zamiast tego w iOS istnieją dwa dodatkowe protokoły: RCTInitializing i RCTInvalidating. Protokoły te służą do definiowania metod initialize i invalidate odpowiednio.
Jeśli twój moduł potrzebuje wykonać kod inicjalizujący, możesz zastosować protokół RCTInitializing i zaimplementować metodę initialize. Aby to zrobić:
- Zmodyfikuj plik
NativeModule.h, dodając następujące linie:
+ #import <React/RCTInitializing.h>
//...
- @interface NativeModule : NSObject <NativeModuleSpec>
+ @interface NativeModule : NSObject <NativeModuleSpec, RCTInitializing>
//...
@end
- Zaimplementuj metodę
initializew plikuNativeModule.mm:
// ...
@implementation NativeModule
+- (void)initialize {
+ // add the initialization code here
+}
@end
Oto przykładowe moduły z rdzenia, które implementują metodę initialize: RCTBlobManager, RCTTiming.
Jeśli twój moduł potrzebuje wykonać kod czyszczący, możesz zastosować protokół RCTInvalidating i zaimplementować metodę invalidate. Aby to zrobić:
- Zmodyfikuj plik
NativeModule.h, dodając następujące linie:
+ #import <React/RCTInvalidating.h>
//...
- @interface NativeModule : NSObject <NativeModuleSpec>
+ @interface NativeModule : NSObject <NativeModuleSpec, RCTInvalidating>
//...
@end
- Zaimplementuj metodę
invalidatew plikuNativeModule.mm:
// ...
@implementation NativeModule
+- (void)invalidate {
+ // add the cleanup code here
+}
@end
Oto przykładowe moduły z rdzenia, które implementują metodę invalidate: RCTAppearance, RCTDeviceInfo.