Как отрендерить API ответа с помощью Flatlist в React Native?

У меня проблема с Flatlist, Мне нужно отобразить данные ответа из API в Flatlist, но это не работает! но когда я устанавливаю статические данные, все работает нормально! и когда я регистрирую {item}, я ничего не показываю в отладке! Я считаю, что синтаксис Flatlist правильный! кто-нибудь, вы можете мне помочь с этим вопросом?

мой код здесь

import React, { Component } from "react";
import {
  StyleSheet,
  Text,
  View,
  TextInput,
  ScrollView,
  Image,
  ActivityIndicator,
  FlatList,
  ListItem
} from "react-native";
import Moment from "react-moment";

import Icon from "react-native-vector-icons/dist/FontAwesome";

export default class App extends Component {
  constructor(props) {
    super(props);
    this.ApiKeyRef = "****";

    this.watchPositionOpts = {
      enableHighAccuracy: true,
      timeout: 20000,
      maximumAge: 1000,
      distanceFilter: 5
    };
    this.state = {
      isLoading: true,
      dataSource: [],
      latitude: null,
      longitude: null,
      error: null

    };
  }

  componentDidMount() {
    this.watchId = navigator.geolocation.watchPosition(
      this.watchPositionSuccess,
      this.watchPositionFail,
      this.watchPositionOpts
    );
  }

  componentWillUnmount() {

    navigator.geolocation.clearWatch(this.watchId);
    navigator.geolocation.stopObserving();
  }

  watchPositionSuccess = position => {
    this.setState(
      {
        latitude: position.coords.latitude,
        longitude: position.coords.longitude,
        error: null
      },
      () => this.fetchCallback()
    );
  };

  watchPositionFail = err => {
    this.setState({ error: err.message });
  };

  fetchCallback = async () => {
    const { latitude, longitude } = this.state;
    const req = `http://api.openweathermap.org/data/2.5/forecast?lat=${latitude}&lon=${longitude}&units=metric&appid=${
      this.ApiKeyRef
    }`;
    const callback = responseJson => {
      // console.info(responseJson);
      // console.info(responseJson.city.name);
    };

    await fetch(req)
      .then(response => response.json())
      .then(responseJson =>
        this.setState({ isLoading: false, dataSource: responseJson }, () =>
          callback(responseJson)
        )
      )
      .catch(error => console.info(error));
  };

  render() {
    const { dataSource } = this.state;

    if (this.state.isLoading) {
      return (
        <View style = {{ flex: 1, padding: 20 }}>
          <ActivityIndicator />
        </View>
      );
    }

    const icon =
      dataSource.list[0].main.temp <= 20
        ? require("./assets/cloudySun.png")
        : require("./assets/sunny.png");

    return (
      <ScrollView style = {styles.container}>
        <View style = {styles.head}>
          <Text style = {styles.titleApp}>Weather App</Text>

        </View>

        <View style = {styles.searchSection}>
          <Icon
            style = {styles.searchIcon}
            name = "search"
            size = {15}
            color = "#333"
          />

          <TextInput
            style = {styles.input}
            placeholder = "Find Your City.."
            underlineColorAndroid = "transparent"
          />
        </View>

        <View style = {styles.details}>

{console.info(this.state.dataSource.city.name)} // I get the City name 
          <FlatList
            data = {this.state.dataSource}
            renderItem = {({ item }) => (
              <Text>
                {item.message}, {item.city.name}
    {console.info(item)} // NO Output
              </Text>
            )}
            keyExtractor = {(item, index) => index}
          />

        </View>
      </ScrollView>
    );
  }
}
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
1 978
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Добавьте реквизит extraData в FlatList. extraData используется для повторного рендеринга FlatList. extraData

Может, это тебе поможет.

           <FlatList
                data = {dataSource}
                extraData = {this.state} //for re-render the Flatlist data item
                renderItem = {({ item }) => (
                  <Text>
                    {item.message}, {item.city.name}
                  </Text>
                )}
                keyExtractor = {(item, index) => index}
              />

преобразовать ответ объекта в массив

      await fetch(req)
          .then(response => response.json())
          .then(responseJson =>{
            let data = [];
            data.push(responseJson); //convert object response to array
            this.setState({ isLoading: false, dataSource: data }, () =>
              callback(data)
            )}
          )
          .catch(error => console.info(error));

вам также нужно изменить свою логику для значков в методе рендеринга:

const icon =
      dataSource[0].list[0].main.temp <= 20
        ? require("./assets/cloudySun.png")
        : require("./assets/sunny.png");

Это работает, когда я устанавливаю реквизиты данных Flatlist на ответ массива, такого как этот data = {this.state.dataSource.list}, потому что они будут их зацикливать для рендеринга, я думаю, но теперь он работает, если у вас есть какие-либо идеи, кроме этого, скажите мне, братан!

DevAS 18.12.2018 15:02

не могли бы вы поделиться своим ответом?

Patel Dhara 19.12.2018 06:07

это происходит потому, что FlatList ожидает массив и ответ, которые вы получаете и храните в this. state.dataSource - это объект. Преобразуйте этот объект или ответ в массив и передайте его в this.state.dataSource. Может это работает

Patel Dhara 19.12.2018 08:21

Я действительно так делаю, сохраняю ответ в таком состоянии, как это источник данных: [], так?

DevAS 19.12.2018 09:51

Я обновил свой ответ. пожалуйста, проверь это. возможно это решит вашу проблему.

Patel Dhara 19.12.2018 10:10

спасибо, чувак, можешь проверить здесь stackoverflow.com/questions/53838539/…?

DevAS 19.12.2018 10:31

Другие вопросы по теме