Collections.singletonMap()
не возвращает полностью реализованный Map
.
public static <K,V> Map<K,V> singletonMap(K key, V value) {
return new SingletonMap<>(key, value);
}
Операции, которые пытаются обновить карту, будут бросать UnsupportedOperationException
(в противном случае возвращенная карта больше не будет неизменной)
Обычно для использования AsyncStorage вы сначала импортируете его в начало файла, в документации сказано, что вы должны импортировать его следующим образом:
import { AsyncStorage } from 'react-native';
Что вы можете увидеть здесь https://facebook.github.io/react-native/docs/asyncstorage
Очевидно, вам следует удалить предыдущий оператор импорта
import { AsyncStorage } from 'AsyncStorage';
[ 1135], если оставить его, вызовет конфликт имен.
Сохранение в 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 с обратным вызовом https://medium.learnreact.com/setstate- принимает-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");
}
}
Это также асинхронная задача и требует 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
}
}