【发布时间】:2022-01-20 19:14:56
【问题描述】:
对于 IOS 应用程序,我有一个在我的选项卡导航器中调用的堆栈。我正在尝试从底部选项卡屏幕导航到堆栈中的屏幕,但出现以下错误。
undefined 不是一个对象(评估 '_this.props.navigation.navigate')
我想在所有屏幕上呈现底部标签。我注意到这会导致 goBack() 以及其他地方出现一些有趣的问题。
如何从底部标签屏幕导航到堆栈屏幕?
当前的实施是一种不好的做法吗?
我已经提供了这个demo 以及下面的代码。我认为这与道具传递有关。
const Tab = createBottomTabNavigator();
function MyTabs() {
return (
<Stack.Navigator
initialRouteName="Home">
<Stack.Screen name="Home" component= {Home} options={{headerShown: false}}/>
<Stack.Screen name="Screen1" component= {Screen1} options={{headerShown: false}}/>
</Stack.Navigator>
);
);
}
export default function App() {
return (
<NavigationContainer>
<Tab.Navigator
initialRouteName="Home"
screenOptions={{
tabBarActiveTintColor: '#F60081',
tabBarInactiveTintColor: '#4d4d4d',
tabBarStyle: {
backgroundColor: '#d1cfcf',
borderTopColor: 'transparent',
},
}}
>
<Tab.Screen
name="Home"
component={MyTabs}
options={{
tabBarLabel: 'Home',
headerShown: false,
tabBarIcon: ({ color, size }) => (
<MaterialCommunityIcons name="home" color={color} size={size} />
),
}}
/>
</Tab.Navigator>
</NavigationContainer>
);
}
const Stack = createStackNavigator();
import * as React from 'react';
import {
Text,
View,
StyleSheet,
TouchableOpacity,
ImageBackground,
} from 'react-native';
const Images = [
{ id: '1', uri: require('./assets/snack-icon.png'), text: 'Test' },
{ id: '2', uri: require('./assets/snack-icon.png') /*text: "Test"*/ },
{ id: '3', uri: require('./assets/snack-icon.png') /*text: "Test"*/ },
{ id: '4', uri: require('./assets/snack-icon.png') /*text: "Test"*/ },
];
export default class Home extends React.Component {
thisNavigate = () => {
this.props.navigation();
};
renderList = (props) => {
return Images.map((item, i) => {
return (
<TouchableOpacity
onPress={() => this.props.thisNavigate.navigate('Screen2')}>
<ImageBackground
source={item.uri}
style={{
width: '100%',
height: 100,
shadowColor: '#000',
shadowOffset: { width: 1, height: 4 },
shadowOpacity: 1,
}}
imageStyle={{ borderRadius: 10 }}></ImageBackground>
</TouchableOpacity>
);
});
};
render() {
return <View style={{ flex: 1 }}>{this.renderList()}</View>;
}
}
【问题讨论】:
-
问题不在该屏幕上,问题将在您的选项卡屏幕上。您单击该功能的位置。如果您在主组件下使用单词“{navigation}”,请将其删除并使用“const navigation = useNavigation();”。它会解决你的问题。您还可以分享您的标签屏幕代码。
-
@TalhaAkbar 我更新了帖子以包含您提到的代码。当我添加 const 导航时,它给我的 useNavigation 是未定义的。在查看更新的代码后,我知道如何去做吗?感谢您的任何见解
标签: reactjs react-native