Установка и настройка
Установка
npx expo install @react-navigation/native
npx expo install react-native-screens react-native-safe-area-context
npx expo install @react-navigation/native-stack
Для Expo — через npx expo install, чтобы подобрались совместимые версии.
Обёртка приложения
// App.tsx
import { NavigationContainer } from '@react-navigation/native';
import { SafeAreaProvider } from 'react-native-safe-area-context';
import RootNavigator from './navigation/RootNavigator';
export default function App() {
return (
<SafeAreaProvider>
<NavigationContainer>
<RootNavigator />
</NavigationContainer>
</SafeAreaProvider>
);
}
SafeAreaProvider — обёртка для useSafeAreaInsets.
NavigationContainer — обязательная обёртка для навигации.
Root Navigator
// navigation/RootNavigator.tsx
import { createNativeStackNavigator } from '@react-navigation/native-stack';
import HomeScreen from '../screens/HomeScreen';
import DetailsScreen from '../screens/DetailsScreen';
const Stack = createNativeStackNavigator();
export default function RootNavigator() {
return (
<Stack.Navigator
initialRouteName="Home"
screenOptions={{
headerStyle: { backgroundColor: '#c1442e' },
headerTintColor: '#fff',
headerTitleStyle: { fontWeight: 'bold' },
contentStyle: { backgroundColor: '#fafafa' },
}}
>
<Stack.Screen
name="Home"
component={HomeScreen}
options={{ title: 'Главная' }}
/>
<Stack.Screen
name="Details"
component={DetailsScreen}
options={{ title: 'Детали' }}
/>
</Stack.Navigator>
);
}
Типизация
export type RootStackParamList = {
Home: undefined;
Details: { id: number };
};
const Stack = createNativeStackNavigator<RootStackParamList>();
Теперь name и params проверяются.
Структура проекта
src/
├── navigation/
│ ├── RootNavigator.tsx
│ └── types.ts
├── screens/
│ ├── HomeScreen.tsx
│ └── DetailsScreen.tsx
├── components/
└── App.tsx
Файл типов
// navigation/types.ts
export type RootStackParamList = {
Home: undefined;
Details: { id: number; title?: string };
Profile: { userId: string };
Settings: undefined;
};
Экспортируется и используется в экранах.
Заголовок экрана
Через options:
<Stack.Screen
name="Details"
component={DetailsScreen}
options={{
title: 'Детали',
headerShown: true,
headerBackTitle: 'Назад',
headerRight: () => <IconButton icon="share" onPress={() => {}} />,
}}
/>
Или в компоненте:
function DetailsScreen() {
const navigation = useNavigation();
useLayoutEffect(() => {
navigation.setOptions({ title: `Пост ${id}` });
}, [id]);
}
Итоги
- Установка через
npx expo install SafeAreaProvider+NavigationContainercreateNativeStackNavigator<RootStackParamList>()- Типы в
navigation/types.ts optionsдля заголовка