Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Различия платформ: Platform

Один и тот же код работает на iOS, Android и в браузере, но иногда платформы нужно различать: тени рисуются по-разному, привычные жесты и отступы отличаются. Для этого есть модуль Platform и файлы с суффиксом платформы.

Platform.OS

Platform.OS — строка с названием платформы: 'ios', 'android' или 'web'.

// app/about.tsx
import { Platform, Text, View } from 'react-native';
 
export default function About() {
  return (
    <View style={{ flex: 1, padding: 16 }}>
      <Text>Платформа: {Platform.OS}</Text>
      <Text>Версия системы: {Platform.Version}</Text>
    </View>
  );
}

На iPhone экран покажет ios и версию iOS, например 18.0, на Android — android и номер API, например 35, а в браузере — web.

Platform.select

Platform.select принимает объект с ключами платформ и возвращает значение для текущей. Удобно для стилей — например, тени у карточки статьи:

// components/PostCard.tsx
import { Platform, StyleSheet, Text, View } from 'react-native';
 
export default function PostCard({ title }: { title: string }) {
  return (
    <View style={styles.card}>
      <Text style={{ fontSize: 16 }}>{title}</Text>
    </View>
  );
}
 
const styles = StyleSheet.create({
  card: {
    backgroundColor: '#fff',
    padding: 16,
    margin: 8,
    borderRadius: 8,
    ...Platform.select({
      ios: { shadowColor: '#000', shadowOpacity: 0.1, shadowRadius: 6 },
      android: { elevation: 3 },
      default: {},
    }),
  },
});

На iOS тень задаётся свойствами shadow*, на Android — одним числом elevation. На обеих платформах карточка будет выглядеть приподнятой над фоном. Ключ default срабатывает для остальных платформ, в том числе для веба.

Выведите карточки в renderItem списка статей вместо строк-ссылок: <PostCard title={item.title} />, обернув карточку в Pressable внутри Link с asChild, как в уроке о маршрутах.

Файлы для платформы

Если отличий много, делают два файла: components/Hint.ios.tsx и components/Hint.android.tsx. Импортируют их без суффикса:

// app/about.tsx
import Hint from '@/components/Hint';

Metro при сборке подставит нужный файл для каждой платформы. Для веба можно добавить Hint.web.tsx, а общий запасной вариант — просто Hint.tsx.

Частая ошибка

Проверять платформу только на ios и забывать про остальные:

// components/PostCard.tsx
// Неправильно: на Android и в вебе получится undefined.
const padding = Platform.select({ ios: 20 });

Если ключа для текущей платформы нет, Platform.select вернёт undefined, и стиль молча не применится. Всегда указывайте все нужные платформы или ключ default.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.