Есть несколько проблем с кодом, который вы вставили в свой вопрос.
Во-первых, constructor
является синхронным, и вы пытаетесь выполнить внутри него асинхронные задачи.Это не очень хорошая идея.
Если вам нужно загрузить значения из AsyncStorage
и сохранить их в state
, вы должны сделать это в componentDidMount
Поэтому установите начальные значения в конструкторе, добавив дополнительное значениеloaded: false
.Это станет важным позже.
constructor (props) {
super(props);
this.state = {
languageChecked: I18n.locale,
anonymityChecked: true,
locationChecked: false,
notificationChecked: false,
statisticsChecked: false,
loaded: false // <- add this additional value
};
}
В настоящее время ваша функция pickLocalKey
фактически ничего не возвращает.Возвращаемое значение находится внутри обещания.К счастью, мы можем преобразовать функцию для использования async/await
.Так что это должно выглядеть примерно так:
pickLocalKey = async (key, defaultValue) => {
try {
let value = await AsyncStorage.getItem(key);
const item = (value !== null && value !== undefined) ? value : defaultValue;
return item === 'true'; // this will make sure we get a Boolean back as long as you store strings 'true' and 'false' for your Booleans
} catch (error) {
return defaultValue;
}
}
Обратите внимание, что await
может бросить, поэтому всегда лучше обернуть его в try/catch
.
Затем в вашем componentDidMount
Вы должны сделать вызовы, чтобы получить значения из AsyncStorage
async componentDidMount () {
// these won't throw as we are catching the error before it gets here
let anonymityChecked = await this.pickLocalKey('anonymity', true);
let locationChecked = await this.pickLocalKey('location', false);
let notificationChecked = await this.pickLocalKey('notification', false);
let statisticsChecked = await this.pickLocalKey('statistics', false);
// set all items in state in one go as multiple calls to setState are not good
this.setState({
anonymityChecked,
locationChecked,
notificationChecked,
statisticsChecked,
loaded: true . // <- we set loaded to true
}, () => console.log(this.state)); // this is how you check state after it has been set
}
Затем в вашем render
теперь вы должны использовать тот факт, что loaded
теперь истинно, чтобы отобразить правильный вид:
render () {
if (this.state.loaded) {
return (
this is the view that you actually want to show
)
} else {
return (
this is the view that you will show when everything is loading
)
}
}
Вот некоторые статьи, которые стоит прочитать: