Когда приложение запускается, появляется SplashScreen.За splashScreen я хочу получить имя пользователя и пароль из кэша, а затем вызвать веб-сервис.Но когда я получаю данные из кеша, например AsyncStorage.getItem('myKey')
, который находится в componentWillMount
, он начинает рендеринг.Это не позволяет componentWillMount
закончить.
Моя большая проблема в том, что componentDidMount
запускается до того, как мои controlallMeth
методы заканчиваются.Из-за этого приложение вылетает в такой ситуации.Как я могу решить эту проблему?
Вот мой код:
Я получаю имя пользователя и пароль из кэша приложения и вызываю веб-службу следующим образом:
componentWillMount(){
AsyncStorage.getItem('myKey').then(value => {
let valuePrsed = JSON.parse(value);
if(valuePrsed.username != null && valuePrsed.password != null)
{
this.setState({username: valuePrsed.username, password: valuePrsed.password});
this.controlallMeth(); // call webservice
}
})
}
Вот метод, где я вызываю веб-сервис:
controlallMeth(){
let collection={}
collection.username = this.state.username,
collection.password = this.state.password
fetch('url', {
method: 'POST',
headers: new Headers({
Accept: 'application/json',
'Content-Type': 'application/json', // <-- Specifying the Content-Type
}),
body: JSON.stringify(collection) // <-- Post parameters
})
.then((response) => response.text())
.then(leaders => {
this.setState({PersonalInfo: leaders});
})
.catch((error) => {
console.error(error);
});
}
А вот componentDidMount
componentDidMount() {
StatusBar.setHidden(true);
this.setState({ fadeAnim: new Animated.Value(0) },
() => {
Animated.timing( // Animate over time
this.state.fadeAnim, // The animated value to drive
{
toValue: 1, // Animate to opacity: 1 (opaque)
duration: 3000,
}
).start(() => {
if(this.state.values != null)
{
console.log("go page1");
this.props.navigation.navigate('Page1',{datas: this.state.PersonalInfo});
}
else{
this.props.navigation.navigate('login');
}
})
}) // Starts the animation
}