【问题标题】:React navigation 5 stack navigator and drawer navigator togetherReact Navigation 5堆栈导航器和抽屉导航器一起
【发布时间】: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;

上面的代码可以工作,但是有一些问题,例如,

  1. 在加载应用时,抽屉最初是可见的,而在应用加载后会隐藏。
  2. 我不想为身份验证屏幕设置抽屉,如果我有 2 个不同的导航而不拆分 AuthenticationStackUserStack 那么我在从 导航时会遇到问题登录个人资料,反之亦然

更新 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


【解决方案1】:

您可以通过有条件地呈现如下导航器来创建类似于切换导航器的东西。

export default function App() {
  const [loggedIn, setLoggedIn] = React.useState(false);
  return (
    <NavigationContainer>
      {loggedIn ? (
        <Drawer.Navigator initialRouteName="Home">
          <Drawer.Screen name="Home" component={HomeScreen} initialParams={{ setLoggedIn }}/>
          <Drawer.Screen name="Notifications" component={NotificationsScreen} />
        </Drawer.Navigator>
      ) : (
        <Stack.Navigator>
          <Stack.Screen
            name="Auth"
            component={AuthScreen}
            initialParams={{ setLoggedIn }}
          />
        </Stack.Navigator>
      )}
    </NavigationContainer>
  );
}

您可以试用这种小吃作为一个工作示例 https://snack.expo.io/@guruparan/switchsample

【讨论】:

  • 我现在实际上正在尝试..我是根据你的回答做的。对如何在登录屏幕上将loggedIn 更新为true 感到震惊
  • 我已经更新了这个问题。检查我的更新 2 块
  • 你检查我的零食了吗?,你可以把setState函数作为参数传进去
  • 你的意思是initialParams
  • 是的,您可以将其作为参数传递并调用它或使用诸如反应上下文之类的东西并从子视图更新值
猜你喜欢
  • 1970-01-01
  • 2018-12-09
  • 1970-01-01
  • 2022-06-30
  • 2018-03-26
  • 1970-01-01
  • 2022-07-23
  • 2020-12-25
  • 1970-01-01
相关资源
最近更新 更多