Kod specyficzny dla platformy
Ta strona została przetłumaczona przez PageTurner AI (beta). Nie jest oficjalnie zatwierdzona przez projekt. Znalazłeś błąd? Zgłoś problem →
Podczas tworzenia aplikacji wieloplatformowej warto ponownie wykorzystać jak najwięcej kodu. Mogą jednak wystąpić sytuacje, w których uzasadnione jest użycie różnych implementacji – na przykład gdy potrzebujesz osobnych komponentów wizualnych dla Androida i iOS.
React Native oferuje dwa sposoby organizacji kodu z podziałem na platformy:
-
Korzystanie z modułu
Platform
Niektóre komponenty mają właściwości działające tylko na jednej platformie. Takie propsy są oznaczone adnotacją @platform i mają specjalną ikonę na stronie dokumentacji.
Moduł Platform
React Native dostarcza moduł wykrywający platformę, na której działa aplikacja. Możesz użyć tej detekcji do implementacji kodu specyficznego dla platformy. Wybierz tę opcję, gdy tylko niewielkie fragmenty komponentu wymagają platformowej specjalizacji.
import {Platform, StyleSheet} from 'react-native';
const styles = StyleSheet.create({
height: Platform.OS === 'ios' ? 200 : 100,
});
Platform.OS przyjmie wartość ios na iOS i android na Androidzie.
Dostępna jest również metoda Platform.select, która przyjmuje obiekt z kluczami 'ios' | 'android' | 'native' | 'default' i zwraca wartość najbardziej pasującą do bieżącej platformy. Na urządzeniach mobilnych pierwszeństwo mają klucze ios i android. Jeśli nie są zdefiniowane, używany jest klucz native, a następnie default.
import {Platform, StyleSheet} from 'react-native';
const styles = StyleSheet.create({
container: {
flex: 1,
...Platform.select({
ios: {
backgroundColor: 'red',
},
android: {
backgroundColor: 'green',
},
default: {
// other platforms, web for example
backgroundColor: 'blue',
},
}),
},
});
Rezultatem będzie kontener z flex: 1 na wszystkich platformach, czerwonym tłem na iOS, zielonym na Androidzie i niebieskim na innych platformach.
Ponieważ metoda akceptuje any wartość, możesz jej użyć do zwracania komponentów specyficznych dla platformy:
const Component = Platform.select({
ios: () => require('ComponentIOS'),
android: () => require('ComponentAndroid'),
})();
<Component />;
const Component = Platform.select({
native: () => require('ComponentForNative'),
default: () => require('ComponentForWeb'),
})();
<Component />;
Detecting the Android version Android
Na Androidzie moduł Platform może również wykrywać wersję platformy, na której działa aplikacja:
import {Platform} from 'react-native';
if (Platform.Version === 25) {
console.log('Running on Nougat!');
}
Uwaga: Version odpowiada wersji API Androida, a nie wersji systemu operacyjnego. Mapowanie znajdziesz w historii wersji Androida.
Detecting the iOS version iOS
Na iOS Version pochodzi z -[UIDevice systemVersion] i jest ciągiem znaków reprezentującym aktualną wersję systemu (np. "10.3"). Aby wykryć główny numer wersji na iOS:
import {Platform} from 'react-native';
const majorVersionIOS = parseInt(Platform.Version, 10);
if (majorVersionIOS <= 9) {
console.log('Work around a change in behavior');
}
Rozszerzenia specyficzne dla platformy
Gdy kod specyficzny dla platformy jest bardziej złożony, warto rozdzielić go na osobne pliki. React Native automatycznie wykrywa pliki z rozszerzeniami .ios. lub .android. i ładuje odpowiedni plik platformy podczas importu przez inne komponenty.
Przykładowa struktura plików:
BigButton.ios.js
BigButton.android.js
Komponent importujesz następująco:
import BigButton from './BigButton';
Komponent importujesz następująco:
Rozszerzenia specyficzne dla środowisk natywnych (współdzielenie kodu z NodeJS i Webem)
Rozszerzenie .native.js stosuj, gdy moduł ma być współdzielony między NodeJS/Webem a React Native bez różnic na poziomie Android/iOS. Szczególnie przydatne w projektach łączących React Native z ReactJS.
Przykładowa struktura plików:
Container.js # picked up by webpack, Rollup or any other Web bundler
Container.native.js # picked up by the React Native bundler for both Android and iOS (Metro)
Nadal możesz go zaimportować bez rozszerzenia .native w następujący sposób:
import Container from './Container';
Ekspert radzi: Skonfiguruj bundler webowy, by ignorował rozszerzenia .native.js. Dzięki temu unikniesz nieużywanego kodu w pakiecie produkcyjnym i zmniejszysz jego końcowy rozmiar.