'First Item in Bottom Tab Navigator Automatically Redirects to Last Item in History
This is a strange one that I'm trying to wrap my head around. I'm trying to have the middle screen be the initial screen that gets shown to the user on app load. If I navigate to the left tab (SelfScreen), then the screen loads the JSX briefly, then automatically redirects to the last thing in the web history.
The SelfScreen functional component has no useEffect hooks. It is, for now, a simple component that just returns plain JSX. I can navigate to and from the Profile page without any issue at all. If I set the SelfScreen as the second component that gets rendered, it works just fine, as well.
Expo init > TypeScript template with Navigation
./src/navigation/index.tsx
const BottomTab = createBottomTabNavigator<RootTabParamList>();
function BottomTabNavigator() {
const {
...
} = useGlobalContext();
const colorScheme = useColorScheme();
return (
<BottomTab.Navigator
initialRouteName="Connections"
screenOptions={{
tabBarActiveTintColor: Colors[colorScheme].tint,
}}>
<BottomTab.Screen
name="SelfScreen"
component={SelfScreen}
options={{
title: 'SelfScreen',
unmountOnBlur: true,
tabBarIcon: ({ color }) => <TabBarIcon name="code" color={color} />,
}}
/>
<BottomTab.Screen
name="Connections"
component={MainConnection}
options={({ navigation }: RootTabScreenProps<'Connections'>) => ({
title: 'Connections',
tabBarIcon: ({ color }) => <TabBarIcon name="code" color={color} />,
headerLeft: () => (
<View>
<Pressable
onPress={() => navigation.navigate('ConnectionSelector')}
style={({ pressed }) => ({
opacity: pressed ? 0.5 : 1,
})}>
<FontAwesome
name="info-circle"
size={25}
color={Colors[colorScheme].text}
style={{ marginRight: 15 }}
/>
</Pressable>
</View>
),
headerRight: () => (
<View style={{flexDirection: 'row'}}>
<Pressable
onPress={() => navigation.navigate('ModalNotifications')}
style={({ pressed }) => ({
opacity: pressed ? 0.5 : 1,
})}>
<FontAwesome
name="info-circle"
size={25}
color={Colors[colorScheme].text}
style={{ marginRight: 15 }}
/>
</Pressable>
<Pressable
onPress={() => navigation.navigate('ModalWriteBid')}
style={({ pressed }) => ({
opacity: pressed ? 0.5 : 1,
})}>
<FontAwesome
name="info-circle"
size={25}
color={Colors[colorScheme].text}
style={{ marginRight: 15 }}
/>
</Pressable>
</View>
),
})}
/>
<BottomTab.Screen
name="Profile"
component={Profile}
options={{
title: 'Profile',
tabBarIcon: ({ color }) => <TabBarIcon name="code" color={color} />,
}}
/>
</BottomTab.Navigator>
);
}
./src/navigation/LinkingConfiguration.tsx
import { LinkingOptions } from '@react-navigation/native';
import * as Linking from 'expo-linking';
import { RootStackParamList } from '../types';
const linking: LinkingOptions<RootStackParamList> = {
prefixes: [Linking.makeUrl('/')],
config: {
screens: {
Root: {
screens: {
Connections: {
screens: {
TabOneScreen: 'one',
},
},
SelfScreen: {
screens: {
SelfScreen: 'two',
},
},
Profile: {
screens: {
ProfileScreen: "three",
}
}
},
},
ConnectionSelector: 'ConnectionSelector',
Modal: 'modal',
... // more modals
NotFound: '*',
},
},
};
export default linking;
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
