如何处理 Firestore 身份验证启动画面
How to handle Firestore authentication splash screen
我正在尝试实现一个 React Native 应用程序,如果 isLoading = true,应用程序显示启动画面,如果 isLoading = false 和 isAuthenticated = false 应用程序显示身份验证屏幕,如果 isLoading = false 和 isAuthenticated = true 应用程序显示主屏幕。
// Splash screen while app loading
if (isLoading) screens = (<><SplashScreen /></>);
// Authentication screens while user not authenticated
else if (!isLoading && !isAuthenticated)
screens = (
<>
<Stack.Screen
name="Register"
component={RegisterScreen}
options={{ animationEnabled: false }}
/>
<Stack.Screen
name="Login"
component={LoginScreen}
options={{ animationEnabled: false }}
/>
</>
);
// All other screens while user authenticated and onboarded
else
screens = (
<>
<Stack.Screen name="Home" component={TabNavigator} />
<Stack.Screen name="Product" component={ProductScreen} />
</>
);
现在我有了它,所以在应用程序启动时(在 Navigation.js 中)我在 5 秒后设置了一个超时,并回调到 setIsAuthenticated(false) 和 setIsLoading(false),这会提示应用程序导航到身份验证页面。否则,如果用户已通过身份验证(使用 onAuthStateChanged 检查),我将导航到主页。
useEffect(() => {
const timeout = setTimeout(() => {
setIsAuthenticated(false);
setIsLoading(false);
}, 5000);
setTimer(timeout);
return () => clearTimeout(timer);
}, []);
只要我在导航到正确页面时在 5 秒内 (onAuthStateChanged) 获得身份验证信息,这种方法就可以正常工作。但是,有些情况下网络非常慢,因此在更新身份验证状态之前调用 Timeout 的回调。在这种情况下,由于回调被调用,我首先导航到身份验证屏幕,然后在用户通过身份验证后立即导航到主页。
这似乎不是一个非常可靠的方法,所以我想知道是否有更好的方法来处理这种身份验证方法?
认证api成功后请更改状态。
const [isAuthenticated,setIsAuthenticated] = useState(false);
...
useEffect(() => {
authAPiCall.then(() => {
setIsAuthenticated(true);
})
const timeout = setTimeout(() => {
setIsLoading(false);
}, 5000);
setTimer(timeout);
return () => clearTimeout(timer);
}, []);
您可以将所有内容都基于您的 onAuthStateChanged 侦听器和状态管理。在路由器文件中创建一个处理用户对象的状态,并在身份验证状态侦听器中根据 onAuthStateChanged 的初始响应设置对象的状态。这样,如果侦听器 return 为空(无授权用户),您可以将导航器的初始路由设置为登录,否则进入应用程序内部。为了实现加载程序,您可以在路由器中创建另一个名为 isLoading 的状态,并从一开始就将其设置为 true。一旦 auth 侦听器 returns 结果,无论它是 null 还是用户对象,都将 isLoading 的状态更改为 false。在该状态下,您可以 return 在导航器被 return 编辑之前查看加载程序。类似这样
const [loading,setLoading] = useState(true)
//here goes the abovementioned logic of setting the loading
if(loading){
return <LoaderComponent/>}
return <Navigator/>
我正在尝试实现一个 React Native 应用程序,如果 isLoading = true,应用程序显示启动画面,如果 isLoading = false 和 isAuthenticated = false 应用程序显示身份验证屏幕,如果 isLoading = false 和 isAuthenticated = true 应用程序显示主屏幕。
// Splash screen while app loading
if (isLoading) screens = (<><SplashScreen /></>);
// Authentication screens while user not authenticated
else if (!isLoading && !isAuthenticated)
screens = (
<>
<Stack.Screen
name="Register"
component={RegisterScreen}
options={{ animationEnabled: false }}
/>
<Stack.Screen
name="Login"
component={LoginScreen}
options={{ animationEnabled: false }}
/>
</>
);
// All other screens while user authenticated and onboarded
else
screens = (
<>
<Stack.Screen name="Home" component={TabNavigator} />
<Stack.Screen name="Product" component={ProductScreen} />
</>
);
现在我有了它,所以在应用程序启动时(在 Navigation.js 中)我在 5 秒后设置了一个超时,并回调到 setIsAuthenticated(false) 和 setIsLoading(false),这会提示应用程序导航到身份验证页面。否则,如果用户已通过身份验证(使用 onAuthStateChanged 检查),我将导航到主页。
useEffect(() => {
const timeout = setTimeout(() => {
setIsAuthenticated(false);
setIsLoading(false);
}, 5000);
setTimer(timeout);
return () => clearTimeout(timer);
}, []);
只要我在导航到正确页面时在 5 秒内 (onAuthStateChanged) 获得身份验证信息,这种方法就可以正常工作。但是,有些情况下网络非常慢,因此在更新身份验证状态之前调用 Timeout 的回调。在这种情况下,由于回调被调用,我首先导航到身份验证屏幕,然后在用户通过身份验证后立即导航到主页。
这似乎不是一个非常可靠的方法,所以我想知道是否有更好的方法来处理这种身份验证方法?
认证api成功后请更改状态。
const [isAuthenticated,setIsAuthenticated] = useState(false);
...
useEffect(() => {
authAPiCall.then(() => {
setIsAuthenticated(true);
})
const timeout = setTimeout(() => {
setIsLoading(false);
}, 5000);
setTimer(timeout);
return () => clearTimeout(timer);
}, []);
您可以将所有内容都基于您的 onAuthStateChanged 侦听器和状态管理。在路由器文件中创建一个处理用户对象的状态,并在身份验证状态侦听器中根据 onAuthStateChanged 的初始响应设置对象的状态。这样,如果侦听器 return 为空(无授权用户),您可以将导航器的初始路由设置为登录,否则进入应用程序内部。为了实现加载程序,您可以在路由器中创建另一个名为 isLoading 的状态,并从一开始就将其设置为 true。一旦 auth 侦听器 returns 结果,无论它是 null 还是用户对象,都将 isLoading 的状态更改为 false。在该状态下,您可以 return 在导航器被 return 编辑之前查看加载程序。类似这样
const [loading,setLoading] = useState(true)
//here goes the abovementioned logic of setting the loading
if(loading){
return <LoaderComponent/>}
return <Navigator/>