【发布时间】:2020-06-01 20:32:40
【问题描述】:
我在尝试在 React-Navigation 抽屉中动态显示不同项目时遇到了一些麻烦。
如果用户登录与否,我有一个抽屉需要显示不同的项目。在这种情况下,如果用户已登录,则不应显示“RegisterScreen”和“LoginScreen”按钮,而应显示“Log Out”按钮。但是,如果用户未登录,则注册和登录屏幕都应显示,而注销按钮不应显示。
我已经使用下面的代码成功显示了按钮(除了注销按钮,我还没有这样做)。但是,一旦用户注销,应用程序会将他们重定向到登录屏幕。由于我没有在抽屉中声明它们,因此出现以下错误:
console.error: The action 'NAVIGATE' with payload {"name":"LoginModal"} was not handled by any navigator.
我明白没有添加屏幕,但我不知道如何在用户登录时隐藏它们。
代码:
//Added DrawerItemList for the Logout button.
const CustomDrawerContent = (props) => {
return (
<DrawerContentScrollView {...props}>
<DrawerItemList {...props} />
<DrawerItem
label="Logout"
onPress={async () => {
props.navigation.closeDrawer();
await LogOut().then((result) => {
props.navigation.navigate('LoginModal');
});
}}
/>
</DrawerContentScrollView>
);
};
const [drawerCategories, setDrawerCategories] = useState([]);
//Checks if the user is logged in and sets Login and Register screens in the state.
useEffect(() => {
let mounted = true;
if (mounted) {
AsyncStorage.getItem('userId').then((result) => {
console.log(result);
if (result == null) {
setDrawerCategories([
...drawerCategories,
{name: 'LoginModal', component: {LoginScreen}},
{name: 'RegisterModal', component: {RegisterScreen}},
]);
}
});
}
return () => (mounted = false);
}, []);
return (
<NavigationContainer>
<RootDrawer.Navigator
drawerType="front"
initialRouteName="Home"
mode="modal"
drawerContent={(props) => <CustomDrawerContent {...props} />}>
<RootDrawer.Screen name="Home" component={MainStackScreen} />
//Add the Register and Login buttons here
{drawerCategories.map((drawer) => {
<RootDrawer.Screen name={drawer.name} component={drawer.component} />;
})}
</RootDrawer.Navigator>
</NavigationContainer>
);
你能帮我弄清楚如何解决这个错误吗?非常感谢!
【问题讨论】:
-
您想在抽屉中显示登录和注册按钮,一旦登录,按钮就会更改为退出抽屉。对? @Leminur
-
没错。基本上,如果用户未登录,我希望“注册”和“登录”按钮位于抽屉中,并且“注销”按钮不可见。如果用户已登录,那么我希望“注销”按钮可见,而“注册”和“登录”按钮消失。
标签: reactjs react-native react-navigation react-navigation-v5 react-navigation-drawer