Я работаю над мобильным приложением и столкнулся с проблемой, которую не знаю, как решить.
Мне нужно загрузить некоторые данные из API после создания экрана. Я делаю это в методе componentDidMount
, который равен async
, поэтому я могу использовать ключевое слово await
. После этого я устанавливаю состояние, чтобы компонент Loader (который представляет собой просто модальный отображаемый текст) был скрыт, а экран повторно отображался с данными из API. Это отлично работает на устройствах Android. Но запуск этого кода на iOS (iPhone X) не работает. Вызываются методы рендеринга SomeScreen.js
и Loader.js
, и метод рендеринга Loader.js
возвращает значение null (проверено с помощью консоли), но представление iPhone не обновляется. Модальный загрузчик все еще существует, даже если его метод рендеринга возвращает значение null. Я что-то не так делаю? Звонок this.foceUpdate()
тоже не помогает.
SomeScreen.js
import React, {Component} from 'react';
import Loader from 'components/Loader/Loader';
export default class SomeScreen extends Component {
constructor(props) {
super(props);
this.state = {
loading: true,
data: []
};
}
async componentDidMount() {
const data = await this.loadData();
this.setState({loading: false, data: data})
}
async loadData() {
//fetch and return data from API
}
render() {
return (
<SafeAreaView style={{flex: 1}}>
<Loader loading={this.state.loading}/>
//other rendering...
</SafeAreaView>
);
}
}
Loader.js
import React, {Component} from 'react';
import {Modal, Text, View} from 'react-native';
export default class Loader extends Component {
static defaultProps = {
loading: false
};
render() {
if (this.props.loading !== true) {
return null;
}
return(
<Modal
transparent={false}
animationType={'none'}
visible={true}>
<View style={{backgroundColor: "white", flex: 1, justifyContent: "center"}}>
<Text>Loading data...</Text>
</View>
</Modal>
)
}
}