Как сохранить переменную в asyncstorage?

Collections.singletonMap() не возвращает полностью реализованный Map.

public static <K,V> Map<K,V> singletonMap(K key, V value) {
        return new SingletonMap<>(key, value);
}

Операции, которые пытаются обновить карту, будут бросать UnsupportedOperationException (в противном случае возвращенная карта больше не будет неизменной)

0
задан Deaf L 19 January 2019 в 16:43
поделиться

1 ответ

AsyncStorage

Обычно для использования AsyncStorage вы сначала импортируете его в начало файла, в документации сказано, что вы должны импортировать его следующим образом:

import { AsyncStorage } from 'react-native';

Что вы можете увидеть здесь https://facebook.github.io/react-native/docs/asyncstorage

Очевидно, вам следует удалить предыдущий оператор импорта

import { AsyncStorage } from 'AsyncStorage'; 
[ 1135], если оставить его, вызовет конфликт имен.

Сохранение в 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.

Чтобы преодолеть это, есть несколько способов справиться с этим

  1. Использовать setState с обратным вызовом
  2. Передать переменную для сохранения в качестве параметра [ 1111]

Использование setState с обратным вызовом

В этой статье довольно подробно рассказывается об использовании 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");
  }
}

Извлечение из 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
   }
}
0
ответ дан Andrew 19 January 2019 в 16:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: