Урок 02

Установка и настройка

Установка

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 + NavigationContainer
  • createNativeStackNavigator<RootStackParamList>()
  • Типы в navigation/types.ts
  • options для заголовка