我有兩個螢屏。首先是啟影片面,我在 firebase.auth().onAuthStateChanged Listener 的幫助下檢查用戶是否已經存在。如果用戶為空,則移動到登錄螢屏,在那里使用另一個 firebase.auth().onAuthStateChanged 偵聽器在電話驗證后獲取用戶,如果用戶未注冊,則將用戶移動到任一用戶詳細資訊螢屏以獲取更多用戶資訊在主螢屏之前或移動到主螢屏之前 .. 同樣的檢查也在啟動螢屏上進行,以確保用戶只有在輸入他的詳細資訊后才會顯示主螢屏.. 問題是在登錄螢屏上,電話驗證后完成,并且 firebase.auth() 檢測到用戶登錄,啟影片面的偵聽器也會被執行,有時會導致致命的崩潰..
那么,我應該如何正確洗掉登錄螢屏上的偵聽器?我的方法不能正常作業。
時間延遲是為了影片在閃屏上顯示
這是啟動螢屏上的代碼:
try{
if(!firebase.apps.length){
firebase.initializeApp(firebaseConfig);
}
}catch(err){
console.log(err);
}
const cacheResourcesAsync = async () => {
//Images to be loaded
];
const cacheImages = images.map(image => {
return Asset.fromModule(image).downloadAsync();
});
return Promise.all(cacheImages);
}
export const SplashLoadingScreen = () => {
const [isReady, setIsReady] = useState(false);
const [isFire, setIsFire] = useState(false);
const [isFont, setIsFont] = useState(false);
const [isImages, setIsImages] = useState(false);
const navigation = useNavigation();
var unsubscribe;
//Loading Fonts
const [michromaLoaded] = useMichroma({ Michroma_400Regular });
const [latoLoaded] = useLato({ Lato_700Bold });
//Checking if the fonts are ready
useEffect(() => {
if(michromaLoaded && latoLoaded){
setIsFont(true);
}
}, [michromaLoaded, latoLoaded]);
//Checking if the Images are loaded or not
useEffect(() => {
cacheResourcesAsync();
setIsImages(true);
return () => unsubscribe = undefined;
}, []);
//Checking if Firebase is fired up
useEffect(() => {
if(firebase.apps.length !== 0){
setIsFire(true);
}
}, [firebase.apps.length]);
//Last Check before moving to other screen
useEffect(() => {
if(isFont && isImages && isFire){
setTimeout(() => {
setIsReady(true); // Animation Purpose
}, 5000);
}
}, [isFont, isImages, isFire]);
//Moving to other screens
useEffect(() => {
if(isReady){
unsubscribe = firebase.auth().onAuthStateChanged((user) => {
if (user) {
firebase.firestore().collection("User Details").doc(firebase.auth().currentUser.uid).get().then((snap) => {
if(snap.exists){
navigation.navigate('Tab');
console.log("Splash"); //Used to check if the listener is still working on login screen
}else {
navigation.navigate('User');
console.log("Splash");
}
});
return;
}
navigation.navigate("SignUp");
});
}
}, [isReady]);
SplashScreen.hideAsync();
uj5u.com熱心網友回復:
我應該如何正確洗掉登錄螢屏上的偵聽器
該onAuthStateChanged()函式實際上回傳一個函式,您可以呼叫它來取消訂閱。
所以,既然你這樣做
unsubscribe = firebase.auth().onAuthStateChanged((user) => {...});
您只需要呼叫unsubscribe()“洗掉偵聽器”即可。請參閱括號,因為它是一個函式。
所以,如果我正確理解你的情況,你應該在打電話之前navigation.navigate(...)打電話。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/362040.html
標籤:javascript 火力基地 反应原生 Firebase 身份验证 世博会
上一篇:將時間戳保存到Firestore
