Как сделать API ответа с Flatlist в реагировать на нативный? - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть проблема с плоским списком, мне нужно отобразить данные ответа из API в плоский список, но это не работает!но когда я устанавливаю статические данные, все работает отлично!и когда я регистрирую {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.log(responseJson);
      // console.log(responseJson.city.name);
    };

    await fetch(req)
      .then(response => response.json())
      .then(responseJson =>
        this.setState({ isLoading: false, dataSource: responseJson }, () =>
          callback(responseJson)
        )
      )
      .catch(error => console.log(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.log(this.state.dataSource.city.name)} // I get the City name 
          <FlatList
            data={this.state.dataSource}
            renderItem={({ item }) => (
              <Text>
                {item.message}, {item.city.name}
    {console.log(item)} // NO Output
              </Text>
            )}
            keyExtractor={(item, index) => index}
          />

        </View>
      </ScrollView>
    );
  }
}

1 Ответ

0 голосов
/ 18 декабря 2018

Добавить 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.log(error));

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

const icon =
      dataSource[0].list[0].main.temp <= 20
        ? require("./assets/cloudySun.png")
        : require("./assets/sunny.png");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...