Przejdź do treści głównej
Wersja: 0.82
Nieoficjalne Tłumaczenie Beta

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ć:

  1. Zmodyfikuj plik NativeModule.h, dodając następujące linie:
NativeModule.h
+ #import <React/RCTInitializing.h>

//...

- @interface NativeModule : NSObject <NativeModuleSpec>
+ @interface NativeModule : NSObject <NativeModuleSpec, RCTInitializing>
//...
@end
  1. Zaimplementuj metodę initialize w pliku NativeModule.mm:
NativeModule.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ć:

  1. Zmodyfikuj plik NativeModule.h, dodając następujące linie:
NativeModule.h
+ #import <React/RCTInvalidating.h>

//...

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

//...

@end
  1. Zaimplementuj metodę invalidate w pliku NativeModule.mm:
NativeModule.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.