Причина, по которой он не работает, заключается в том, что вы пытаетесь изменить параметры родительского навигатора внутри дочернего навигатора. Сначала вам не нужно устанавливать заголовок в options
prop в компоненте Login
для того, что вы пытаетесь сделать:
function Login() {
return (
<LoginStack.Navigator>
<LoginStack.Screen
name="UsernameScreen"
component={UsernameScreen}
/>
{/* TODO: ADD another screen for loggin in */}
<LoginStack.Screen name="LoginScreen" component={LoginScreen} />
<LoginStack.Screen
name="MainScreen"
component={Main}
/>
</LoginStack.Navigator>
);
}
Затем вы можете создать функцию для обработки того, как родительский заголовок заголовка должен измениться в зависимости от дочернего элемента:
function getHeaderTitle(route) {
// If the focused route is not found, we need to assume it's the initial screen
// This can happen during if there hasn't been any navigation inside the screen
const routeName = getFocusedRouteNameFromRoute(route) ?? 'UsernameScreen';
switch (routeName) {
case 'UsernameScreen':
return 'Signup'
case 'MainScreen':
return 'Home';
// etc...
}
}
Затем вы можете использовать функцию в родительском навигаторе стека следующим образом:
// ...
<Stack.Navigator>
<Stack.Screen
name="Login/Signup"
component={Login}
options={({ route }) => ({
headerTitle: getHeaderTitle(route),
})}
/>
// ...
</Stack.Navigator>
// ...
Этот подход очень хорошо описан в документации здесь: https://reactnavigation.org/docs/screen-options-resolution/#setting -parent-screen-options-based-on-child-navigators-state .
Обязательно импортируйте getFocusedRouteNameFromRoute из @ response-navigation / native.