AsyncStorage
Обычно для использования AsyncStorage вы сначала импортируете его вверху файла, в документации сказано, что вы должны импортировать его следующим образом:
import { AsyncStorage } from 'react-native';
Что вы можете увидеть здесьhttps://facebook.github.io/react-native/docs/asyncstorage
Очевидно, вам следует удалить предыдущий оператор импорта
import { AsyncStorage } from 'AsyncStorage';
, так как оставив его, вы вызовете конфликты имен.
Сохранение в AsyncStorage
Сохранение в AsyncStorage является асинхронной задачей, поэтому вы должны использовать функцию async/await
, которая означает, что вы должны обновить свою функцию storeData()
.Вы можете посмотреть документацию https://facebook.github.io/react-native/docs/asyncstorage, чтобы узнать, как это сделать.
storeData = async () => {
const {a} = this.state;
let mynum = a;
try {
await AsyncStorage.setItem('array', mynum)
Alert("Saved");
} catch (err) {
console.warn(err);
}
}
Настройка состояния
Затем, похоже, вы можете оказаться в состоянии гонки, когда устанавливаете состояние.SetState требуется время, чтобы установить состояние элемента.Поэтому, когда вы звоните
this.setState({ b: this.state.a });
, состояние, возможно, фактически не было установлено к тому времени, когда вы звоните
this.storeData();
, ведущему кневерное значение хранится в AsyncStorage.
Чтобы преодолеть это, есть несколько способов справиться с этим
- Использовать setState с обратным вызовом
- Передать переменную для сохранения в качестве параметра
this.storeData()
Использование setState с обратным вызовом
В этой статье довольно подробно рассказывается об использовании setState с обратным вызовом https://medium.learnreact.com/setstate-takes-a-callback-1f71ad5d2296, однако вы можете реорганизовать свой onPressButton
вчто-то вроде этого
onPressButton = () => {
if (this.state.a == this.state.aa) {
this.setState({ b: this.state.a }, async () => { await this.storeData(); });
} else {
Alert("Try Again");
}
}
Это гарантирует, что this.storeData()
не будет запущен, пока состояние не будет обновлено.
Передать переменную для хранения в качестве параметра
Для этого требуется рефакторинг функции storeData()
для получения параметра
storeData = async (mynum) => {
try {
await AsyncStorage.setItem('array',mynum)
Alert("Saved");
} catch (err) {
console.warn(err);
}
}
Теперь, чтобы использовать эту функцию, мы должны обновитьyour onPressButton
, обратите внимание, что мы передаем значение, которое мы хотим сохранить, в storeData
, что означает, что нам больше не нужно обращаться к нему из состояния внутри storeData
onPressButton = async () => {
if (this.state.a == this.state.aa) {
this.setState({ b: this.state.a });
await this.storeData(this.state.a);
} else {
Alert("Try Again");
}
}
Получение из AsyncStorage
Это также асинхронная задача, для которой требуется async/await
.Чтобы получить строку, которую вы сохранили, все, что вам нужно сделать, это передать правильный ключ функции retrieveData
retrieveData = async (key) => {
try {
const value = await AsyncStorage.getItem(key);
if (value !== null) {
// We have data!!
console.log(value);
// do something with the value
}
} catch (error) {
// Error retrieving data
}
}