这是主要的应用程序(Expo sdk36 with react-navigation 5):
<Provider store={store}>
<AuthContext.Provider value={authContext}>
<NavigationContainer
onStateChange={(stateNavigation) => console.log('New stateNavigation is', stateNavigation, state)}
>
<SafeAreaProvider>
<Stack.Navigator screenOptions={{ headerShown: false }}>
{state.isLoading ? (
<Stack.Screen name="Loading" component={AppLoadingScreen} />
) : state.profile === null ? (
// No status, user isn't signed in
<Stack.Screen name="SignInScreen" component={SignInScreen} />
) : (
// User is signed in
<Stack.Screen name="HomeScreen" component={HomeScreen} />
)}
</Stack.Navigator>
</SafeAreaProvider>
</NavigationContainer>
</AuthContext.Provider>
</Provider>
SignInScreen 和 HomeScreen 是 ScreenNavigator :
function SignInScreen() {
const { signIn } = React.useContext(AuthContext);
return (
<Stack.Navigator screenOptions={{ headerShown: false }}>
<Stack.Screen name="SignIn">
{(props) => <SignIn {...props} signIn={signIn} />}
</Stack.Screen>
</Stack.Navigator>
);
}
function HomeScreen() {
const { signOut } = React.useContext(AuthContext);
return (
<Stack.Navigator screenOptions={{ headerShown: false }}>
<Stack.Screen name="Home">{(props) => <Home {...props} />}</Stack.Screen>
<Stack.Screen name="Profile">
{(props) => <Profile {...props} signOut={() => signOut()} />}
</Stack.Screen>
</Stack.Navigator>
);
}
它从登录开始,我登录,然后转到主页,我选择个人资料按钮,它会无限期地刷新个人资料屏幕。我可以单击注销按钮,然后它会进入登录屏幕(这里再次闪烁几下)。stateNavigation 和 state 的完整日志在这里:https ://gist.github.com/lc3t35/d32d5ef6d042fec4c1344fbe9769b06b
欢迎任何想法。