开发者问题收集

如何在 React Native 中的 FlatList 中呈现数据,我可以通过控制台记录它,但在屏幕上显示它时遇到问题

2021-06-15
736

我想使用异步存储实现兑现,但我遇到了该错误

TypeError:未定义不是对象(评估'item.id.toString')

这是我的代码

import React, {useState} from 'react';
import {View, Button, FlatList, Text} from 'react-native';
import AsyncStorage from '@react-native-async-storage/async-storage';

const books = [
  {id: 1, name: 'book 1'},
  {id: 2, name: 'book 2'},
  {id: 3, name: 'book 3'},
];

export default function GetDataScreen() {
  const [Books, setBooks] = useState([]);
  console.log(Books.length);
  console.log(Books);

  const clearAsyncStorage = async () => {
    AsyncStorage.clear();
  };

  const storeData = async value => {
    try {
      const books = JSON.stringify(value);
      await AsyncStorage.setItem('books', books);
    } catch (e) {
      console.log(e);
    }
  };

  const getData = async () => {
    try {
      const jsonValue = await AsyncStorage.getItem('books');

      setBooks(jsonValue);
      console.log(Books);
      return jsonValue != null ? JSON.parse(jsonValue) : null;
    } catch (e) {
      console.log(e);
    }
  };

  React.useEffect(() => {
    getData();
  }, []);

  return (
    <View>
      <Button title="Save" onPress={() => storeData(books)} />
      <Button title="get" onPress={() => getData()} />
      <FlatList
        data={Books}
        keyExtractor={item => item.id.toString()}
        renderItem={({item}) => <Text>{item.id}</Text>}
      />
    </View>
  );
}

我从异步存储中获取数据,并在注释我的 FlatList 时将其记录在控制台中, 在此处输入图像描述

但是当我取消注释 FlatList 时,出现该错误 “ TypeError:未定义不是对象(评估'item.id.toString')”

2个回答

您正在将整个数组存储在店内方法中,当您获取时,您将整个数组作为一个项目获取,因此它肯定会给您一个错误。

您可以传递下面提到的密钥提取器:

keyExtractor={(item,index) => item.id}

当您从异步获取数据时,您将收到项目作为a

[ { " i d " : 1 , " n a m e " : " b o o k

1 " } , { " i d " : 2 , " n a m e " : " b o o k

2 " } , { " i d " : 3 , " n a m e " : " b o o k

3 " } ]

存储时应该是单个的,但您按下保存按钮时会存储整个数组。

希望您能理解。

Awais Ibrar
2021-06-15

您在解析之前使用了 setData,这就是它不起作用的原因

React.useEffect(() => {
  getData().then(res => setData(res));
}, []);

这将为您修复它

Waqas Ali
2022-09-22