#android #react-native
Вопрос:
Я относительно новичок в родной реакции, и я пытался написать этот код, в котором я получаю тип пользователя (т. е. Администратор или Мод) из своей базы данных и переключаюсь на соответствующий навигатор ящиков. В промежутках между переключениями я загружаю заставку. Моя проблема в том, что, скажем, я вхожу в систему как администратор, затем выхожу из системы и пытаюсь войти в систему как мод, за долю секунды до загрузки заставки отображается мой предыдущий экран (т. е. экран администратора). Любая помощь будет очень признательна.
const App = () => {
const [isLoading, setIsLoading] = useState(true);
const [userType, setUserType] = useState(null);
const [User, setUser] = useState(null);
const getUserType = async () => {
//Getting UserType from Database
setUserType(fetchedUserType);
};
const onAuthStateChanged = user => {
setUser(user);
setTimeout(() => {
if (isLoading) setIsLoading(false);
}, 2000);
};
useEffect(() => {
const subscriber = auth().onAuthStateChanged(onAuthStateChanged);
return subscriber;
});
useEffect(() => {
//clearing the UserType and making the splash screen render
setUserType(null);
setIsLoading(true);
let Mounted = true;
getUserType().then(() => {
if (Mounted) {
setIsLoading(false);
}
return function cleanup() {
Mounted = false;
};
});
}, [User]);
if (isLoading) {
return <Splash></Splash>;
} else if (User === null) {
return <Login></Login>;
} else if (userType === 'Admin') {
return <AdminDrawerNavigator></AdminDrawerNavigator>;
} else if (userType === 'Mod') {
return <ModDrawerNavigator></ModDrawerNavigator>;
} else {
return <Fatal></Fatal>;
}
};
Ответ №1:
Попробуйте добавить в рендеринг:
if(userType===null){
return null;
}
if (isLoading) {
return <Splash></Splash>;
} else if (User === null) {
return <Login></Login>;
} else if (userType === 'Admin') {
return <AdminDrawerNavigator></AdminDrawerNavigator>;
} else if (userType === 'Mod') {
return <ModDrawerNavigator></ModDrawerNavigator>;
} else {
return <Fatal></Fatal>;
}
Комментарии:
1. Это, похоже, не работает, потому что изначально тип пользователя имеет значение null, поэтому программа просто показывает пустой экран
Ответ №2:
Удалось устранить эту проблему, удалив эффект setUserType(null)
второго использования.