我试图在我的主屏幕加载我的react-native应用程序之前显示一个非动画模式 . 基本上我想检查用户是否登录,如果没有登录用户在模态视图上显示登录屏幕 .
问题是我的主屏幕在我的模态之前瞬间出现,而不是首先出现的模态 . 我是新手反应/ javascript一般,我不知道如何解决这个问题 .
我将登录检查放在componentWillLoad中,认为这将在组件在屏幕上呈现之前发生,但它似乎不起作用 .
export default class MyClass extends Component {
state = {
modalVisible: false,
}
componentWillMount() {
// Check if a user is signed in
firebase.auth().onAuthStateChanged(function(user) {
if (user) {
// User is signed in.
console.log("Signed in");
this.setState({modalVisible: false});
} else {
// No user is signed in.
console.log("Not signed in");
this.setState({modalVisible: true});
}
}.bind(this));
}
render() {
return (
<View>
<NavigatorIOS
initialRoute={{
component: Things,
title: 'MyScene',
}}
style={{flex: 1}}
/>
<Modal
animationType={"none"}
transparent={false}
visible={this.state.modalVisible}
onRequestClose={() => {alert("Modal has been closed.")}}
>
<Login />
</Modal>
</View>
);
}
}
1 回答
它出现了一瞬间,因为
onAuthStateChanged
调用是asynchronous
并且react不会等待它完成并继续运行,因此你的渲染会在firebase返回之前发生 . 所以要解决这个问题,你必须等到firebase返回 . 要实现这一点,让我们使用状态 . 将创建一个名为isFirebaseReturned
的状态变量 . 在下面的代码中react
将仅在isFirebaseReturned = true
时呈现NavigatorIos
或Modal