【发布时间】:2020-11-27 07:21:36
【问题描述】:
基本上我来自 react-navigation v4,我熟悉 SwitchNavigator 作为桥接器的处理方式,但 v5 不支持 SwitchNavigator,所以有点难以理解下面的实现。
const Stack = createStackNavigator();
const Drawer = createDrawerNavigator();
function AuthenticationStack({ navigation }) {
return (
<Stack.Navigator initialRouteName="Home" screenOptions={{headerShown: false}}>
<Stack.Screen name="Home" component={Home} />
<Stack.Screen name="Login" component={Login} />
<Stack.Screen name="Registration" component={Registration} />
</Stack.Navigator>
);
}
function UserStack({ navigation }) {
return (
<Stack.Navigator initialRouteName="Jobs" screenOptions={{headerShown: false}}>
<Stack.Screen name="Jobs" component={Profile} />
<Stack.Screen name="JobDetails" component={JobDetails} />
</Stack.Navigator>
);
}
function App() {
return (
<NavigationContainer>
<Drawer.Navigator drawerContent={props => <SideBar { ...props } />}>
<Drawer.Screen name="Home" component={AuthenticationStack} />
<Drawer.Screen name="Jobs" component={UserStack} />
</Drawer.Navigator>
</NavigationContainer>
);
}
export default App;
上面的代码可以工作,但是有一些问题,例如,
- 在加载应用时,抽屉最初是可见的,而在应用加载后会隐藏。
- 我不想为身份验证屏幕设置抽屉,如果我有 2 个不同的导航而不拆分 AuthenticationStack 和 UserStack 那么我在从 导航时会遇到问题登录个人资料,反之亦然
更新 1
export default() => {
const [logged, setUser] = React.useState(false);
return (
<NavigationContainer>
{
logged
?
<DrawerScreen initialParams={{ setUser }} />
:
<AuthStackScreen initialParams={{ setUser }} />
}
</NavigationContainer>
);
}
现在在 login.js 中,我需要将 setUser 更新为 true,对吗?如果是,我如何访问我的 login.js 文件中的 setUser
更新 2
class Login extends Component {
fetch(login_url, {
method: "POST",
headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Accept-Language': 'en-US' },
body: JSON.stringify(data)
})
.then((response) => {
const success = response.ok;
const data = response.json();
return Promise.all([success, data]);
})
.then(([success, response]) => {
var data, userInfo;
if (success) {
data = {
token: response.token,
user: response.user,
}
if(_storeUserData(response)) {
_retrieveUserData().then((userInfo) => {
this.setState({
logged: true,
userInfo: userInfo,
loading:false,
email: '',
password: ''
});
navigate('Profile');
})
.catch((error) => {
// alert(error);
});
}
}
this.setState(state_data);
})
.catch((error) => {
alert('Error:'+error);
this.setState({ loading: false});
});
}
【问题讨论】:
-
您应该查看reactnavigation.org/docs/auth-flow 并实现类似的东西,一次只有一个导航器
-
@GuruparanGiritharan 但 AuthenticationStack 不应该是抽屉导航器。我怎样才能同时拥有两者?
-
逻辑是 someConditionForLogin ?
: -
@GuruparanGiritharan 我可以举个简单的例子吗?
-
你试过答案了吗?
标签: react-native react-navigation react-navigation-stack react-navigation-v5 react-navigation-drawer