Вот основное приложение (Expo sdk36 с реактивной навигацией 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 и состояния находится здесь: https://gist.github.com/lc3t35/d32fcd5ef6d1 / а>
Любая идея приветствуется.