Расширение и отображение массива в asyncstorage в React-native - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь добавить пользовательский ввод в определенный массив внутри AsyncStorage.Я не уверен, что мой текущий код делает это.Я не могу отобразить его через «alert ()», и в настоящее время я получаю эту ошибку: the bind value at index 1 is null"

async addAvailableActivity(){
  try {
    AsyncStorage.getItem('availableActivities')
    .then(activities => {this.availableActivities = JSON.parse(activities)})
  } catch (error) {
    alert('Couldnt load activities!')
  }

  let newActivity = this.state.newActivity
  this.availableActivities.push(newActivity)

  try {
    AsyncStorage.setItem('availableActivities', JSON.stringify(this.availableActivities))
  } catch (error) {
    alert('Couldnt add activity!')
  }

}

async displayAvailableActivities(){
  AsyncStorage.getItem(this.availableActivities).then(activities => {alert(activities)})    
}

Ответы [ 4 ]

0 голосов
/ 20 сентября 2018

Похоже, что вы пытаетесь получить элемент неверным способом.

async displayAvailableActivities(){
 AsyncStorage.getItem(this.availableActivities).then(activities => {alert(activities)}) 
}

Первый параметр для getItem должен быть string :

async displayAvailableActivities(){
 AsyncStorage.getItem('availableActivities').then(activities => {alert(activities)})    
}

AsyncStorage getItem

0 голосов
/ 20 сентября 2018

Эта строка

AsyncStorage.getItem(this.availableActivities).then(activities => {alert(activities)})

Должна быть

AsyncStorage.getItem('availableActivities').then(activities => {alert(activities)})

0 голосов
/ 20 сентября 2018

Я думаю, что проблема в том, что вы используете AsyncStorage, который вызывает Async таким образом.Я думаю, что таким образом ваш код будет работать:

async addAvailableActivity(){
  try {
    AsyncStorage.getItem('availableActivities')
    .then(activities => {this.availableActivities = JSON.parse(activities)
    let newActivity = this.state.newActivity
    this.availableActivities.push(newActivity)
   })
  } catch (error) {
    alert('Couldnt load activities!')
  }

  try {
    AsyncStorage.setItem('availableActivities', JSON.stringify(this.availableActivities))
  } catch (error) {
    alert('Couldnt add activity!')
  }
} 

Вам также нужно использовать его не совсем после этой функции.Используйте это где-нибудь еще.

 async displayAvailableActivities(){
      AsyncStorage.getItem(this.availableActivities).then(activities => {alert(activities)})    
    }
0 голосов
/ 20 сентября 2018

Есть несколько проблем с вашим кодом, во-первых, я бы сохранил availableActivities в состоянии вашего компонента, если вы хотите охватить его таким образом.Во-вторых, когда вы вызываете функцию async, вы должны использовать await для своих обещаний, третье и самое важное AsyncStorage.getItem(this.availableActivities) это похоже на опечатку, но AsyncStorage пары значений ключа должны быть строками.

Вот обновление вашего кода, которое, я думаю, обеспечит необходимую вам функциональность:

addAvailableActivity = async () => {
  try {
    let activities = await AsyncStorage.getItem('availableActivities')
    let { newActivity } = this.state
    if (activities != null) {
      activities = JSON.parse(activities)
      activities.push(newActivity)
      await AsyncStorage.setItem( 'availableActivities', JSON.stringify(activities) )
    }
  } catch (error) {
    console.warn(error)
  }
}

displayAvailableActivities = () => {
  let activities = await AsyncStorage.getItem('availableActivities')
  console.warn(JSON.parse(activities))
}

обратите внимание, что я изменил объявления функций, это не обязательно, ноэто препятствует тому, чтобы они были связаны с вашим конструктором.async / await является альтернативным синтаксисом .then, который намного чище и проще для чтения.Чтобы проверить, вернул ли AsyncStorage значение, лучше всего проверить его по null и, наконец, я исправил опечатку в вашей последней функции.Дайте мне знать, если у вас есть какие-либо вопросы или я пропустил оценку

...