Пытаясь передать реквизиты через навигацию, я считаю, что это как-то связано с моим набором AysncyStorage. - PullRequest
0 голосов
/ 12 июля 2020

Я пытаюсь передать некоторые значения на другой экран, это сработало в первый раз, когда я попробовал его с одним значением, используя async хранилище, установленное для одного элемента, однако теперь я пытаюсь использовать его с несколькими, и это продолжает сбой каждый раз, когда я нажимаю элемент, из которого хочу получить данные.

Сохранение данных, когда я нажимаю элемент из метода FlatList

fetchOnPressOpacity = async item => {
  this.state.totalCalories += item.food.nutrients.ENERC_KCAL;
  this.state.totalFat += item.food.nutrients.FAT;
  this.state.totalCarbs += item.food.nutrients.CHOCDF;
  this.state.totalProtein += item.food.nutrients.PROCNT;

  const firstPair = ["totalCalories", JSON.stringify(this.state.totalCalories)];
  const secondPair = ["totalCarbs", JSON.stringify(this.state.totalCarbs)];
  const thirdPair = ["totalProtein", JSON.stringify(this.state.totalProtein)];
  const fourthPair = ["totalFat", JSON.stringify(this.state.totalFat)];

  try {
    this.setState({});

    await AsyncStorage.multiSet(firstPair, secondPair, thirdPair, fourthPair);
  } catch (error) {
    console.log(error);
  }
};

getData(), я не слишком уверен, как хранить данные:

getData = async () => {
  try {
    const values = await AsyncStorage.multiGet([
      "totalCalories",
      "totalCarbs",
      "totalProtein",
      "totalFat"
    ]);
  } catch (e) {
    // read error
  }
  console.log(values);
};

Итак, сейчас моя основная проблема заключается в том, что приложение вылетает, когда я нажимаю элемент. Я получаю указанную ниже ошибку, но не думаю, что это проблема.

VirtualizedList: отсутствуют ключи для элементов, не забудьте указать свойство key или id для каждого элемента или предоставить настраиваемый keyExtractor.

Я также могу записать в консоль значение до сбоя приложения.

Не могли бы вы посоветовать мне?

Ответы [ 2 ]

1 голос
/ 12 июля 2020

Простое решение

var items = [['key1', 'value1'], ['key2', 'value2']]
AsyncStorage.setItem("DATA_KEY", JSON.stringify(items))
// or
AsyncStorage.multiSet(items, () => {
//to do something
});

Для вашего кода

var items = [firstPair, secondPair, thirdPair, fourthPair];
AsyncStorage.setItem("DATA_KEY", JSON.stringify(items))

Получить данные

AsyncStorage.multiGet(["key1", "key2"]).then(response => {
//to do something
})
0 голосов
/ 15 июля 2020

На самом деле это не исправление для вашего кода, но если это просто передача данных на другой экран, вы можете подумать о передаче данных с помощью навигации.

например:

const { navigation } = this.props;
navigation.navigate('YourNextScreen',
     {
       totalCalories: this.state.totalCalories,
       totalCarbs: this.state.totalCarbs,
       totalProtein: this.state.totalProtein,
       totalFat: this.state.totalFat,
     });

и получить их in:

const {
    totalCalories,
    totalCarbs,
    totalProtein,
    totalFat
} = this.props.route.params;

на случай, если вы не хотите специально сохранять эти данные для дальнейшего использования ...

https://reactnavigation.org/docs/params/

...