首页 > 解决方案 > Invariant Violation 试图获取超出范围索引 NaN 的帧(React Native) - 在 React Native 中获取数据的 FlatList

问题描述

我试图在React Native中将数组显示为FlatList ,但它一直给我以下错误:“不变违规:试图获取超出范围索引 NaN 的帧”

我的代码:

async function getNarrators() {
  const response = await fetch(
    'https://islamcompanion.pakjiddat.pk/api/get_narrators',
    {
      method: 'post',
      headers: {
        Accept: 'application/json',
        'Content-Type': 'application/x-www-form-urlencoded',
      },
      body: 'language=english',
    },
  );
  const json = await response.json();
  var peopleArray = Object.values(json);
  console.log(peopleArray);
  return peopleArray;
}

const ListItem = ({title}) => (
  <View>
    <Text>{title}</Text>
  </View>
);

function HomeScreen({navigation}) {
  return (
    <View style={{flex: 1, alignItems: 'center', justifyContent: 'center'}}>
      <Text></Text>

      <FlatList
        data={getNarrators()}
        keyExtractor={(item) => item}
        renderItem={({item}) => <ListItem title={item} />}
      />

      <Button
        title="Go to Details"
        onPress={() => navigation.navigate('Details')}
      />
      <MyButton />
    </View>
  );
}

输出自

console.log(peopleArray);

[“AJ Arberry”、“Abdul Majid Daryabadi”、“Abdullah Yusuf Ali”、“Abul Ala Maududi”、“Ahmed Ali”、“Ahmed Raza Khan”、“Ali Quli Qarai”、“英文音译”、“Hasan al- Fatih Qaribullah 和 Ahmad Darwish”、“Mohammad Habib Shakir”、“Mohammed Marmaduke William Pickthall”、“Muhammad Sarwar”、“Muhammad Taqi-ud-Din al-Hilali 和 Muhammad Muhsin Khan”、“Saheeh International”、“Talal Itani” ,“瓦希杜丁汗”]

标签: javascriptarraysreact-nativenanreact-native-flatlist

解决方案


您需要在代码中使用 useEffect 和 useState 并且需要像这样获取您的 API,我对您的代码进行了一些更改,尝试这样做:

import {View, Text, FlatList, Button} from 'react-native';
import React, { useEffect, useState } from 'react';

function HomeScreen({navigation}) {
    const [data, setData] = useState([]);
    useEffect(() => {
      const fetchData = async () => {
        const response = await fetch(
            'https://islamcompanion.pakjiddat.pk/api/get_narrators',
            {
              method: 'post',
              headers: {
                Accept: 'application/json',
                'Content-Type': 'application/x-www-form-urlencoded',
              },
              body: 'language=english',
            },
          );
          const json = await response.json();
          var peopleArray = Object.values(json);
          console.log(peopleArray);
        setData(peopleArray);
      };
      fetchData();
    }, []);
    const ListItem = ({title}) => (
        <View>
          <Text>{title}</Text>
        </View>
      );
    return   <View style={{flex: 1, alignItems: 'center', justifyContent: 'center'}}>
    <Text></Text>

    <FlatList
      data={data}
      keyExtractor={(item) => item}
      renderItem={({item}) => {
          console.log("item is",item);
          return(
            <ListItem title={item} />
          )

      }
     }
    />

    <Button
      title="Go to Details"
      onPress={() => navigation.navigate('Details')}
    />
  </View>
  };

在此处输入图像描述

希望这可以帮助!


推荐阅读