如何在Stack Navigation的React native中传递导航道具?

发布时间:2020-07-07 10:00

我是本机的新手,并且在React Navigation版本5.x中遇到了一些问题

App.js文件在下面

import { NavigationContainer } from "@react-navigation/native";
import { createStackNavigator } from "@react-navigation/stack";
import MyDrawer from "./components/MyDrawer";
import LoginScreen from "./screens/LoginScreen";

import firebase from "firebase";
import { firebaseConfig } from "./config";
firebase.initializeApp(firebaseConfig);


const Stack = createStackNavigator();

export default class App extends React.Component {
  state = {
    isLoggedIn: false,
  };
  logOut = () => {
    this.setState({ isLoggedIn: false });
    firebase.auth().signOut();
  };
  render() {
    return (
      <NavigationContainer>
        <Stack.Navigator
          screenOptions={{
            headerShown: false,
          }}
        >
          {this.state.isLoggedIn ? (
            <>
              <Stack.Screen name="Home" component={MyDrawer} />
            </>
          ) : (
            <Stack.Screen name="SignIn" component={LoginScreen} />
          )}
        </Stack.Navigator>
      </NavigationContainer>
    );
  }
}


如果用户登录到Firebase,它将导航到MyDrawer.js。它有一个自定义的抽屉,并且抽屉有一个注销按钮。

MyDrawer.js

import HomeScreen from "../screens/HomeScreen";
import Colors from "../Colors";
import ShareListScreen from "../screens/ShareListScreen";
import Inpiration from "../screens/Inspiration";

const Drawer = createDrawerNavigator();

export default class MyDrawer extends React.Component {
  state = {
    title: this.props,
  };
  render() {
    return (
      <Drawer.Navigator
        initialRouteName="Home"
        drawerContent={(props) => <CustomDrawerContent {...props} />}
      >
        <Drawer.Screen name="Home" component={HomeScreen} />
        <Drawer.Screen name="Share List" component={ShareListScreen} />
        <Drawer.Screen name="Inspiration" component={Inpiration} />
      </Drawer.Navigator>
    );
  }
}
function CustomDrawerContent(props) {
  return (
    <DrawerContentScrollView {...props}>
      <View >
        <ImageBackground source={image} >
          <Text>
            Bring
            <Text>Me</Text>
          </Text>
        </ImageBackground>
      </View>
      <DrawerItemList {...props} />
      <ImageBackground source={home} >
        <Text >Home</Text>
      </ImageBackground>
      <ImageBackground source={work} >
        <Text>Workplace</Text>
      </ImageBackground>
      <DrawerItem
        label="Log out"
        onPress={() => {
          this.props.logOut;
          this.props.navigation.navigate("SignIn"); 
 
  // Once the button pressed I want the user to sign out from firebase and navigate
to the root and set isLoggedIn state to true in App.js. 

        }}
      />
    </DrawerContentScrollView>
  );
}

一旦按下注销按钮,我希望用户从Firebase注销并导航到根目录,然后在App.js中将isLoggedIn状态设置为true。 (在App.js中调用注销功能。)

我该如何实现?

回答1

您可以使用initialParams传递注销功能。

 <Stack.Screen name="Home" component={MyDrawer} initialParams={{this.logout}}/>

可以在MyDrawer类中以this.props.routes.params.logout()的形式访问此函数

当状态发生变化时,您无需导航至登录状态,您只需渲染“ SignIn”,应用程序就会自动显示登录屏幕。