Рендеринг данных Firebase в FlatList - PullRequest
0 голосов
/ 10 ноября 2019

Я использую React Native , Rematch для Redux и Firebase Firestore . Я пытаюсь получить данные из моей базы данных Firebase и заполнить их внутри моего FlatList . Проблема в том, что это не дает мне никакой ошибки, а дает мне чистый белый экран. Я не знаю, где я иду не так.

Вот так выглядит моя база данных - список activities

activities database picture

Вот как выглядит мой Rematch для Redux store :

import firebase from 'firebase';
import db from '../config/firebase'

const activity = {
    state: {},
    reducers: {
        activities(state, payload) {
            return {
                ...state,
                ...payload
            }
        },
    },
    effects: {
        async getActivities() {
            try {
                const response = await db.collection('activities').get()
                //console.log(response.docs.map(doc => doc.data()))
                return dispatch({ type: 'activity/activities', payload: response.docs.map(doc => doc.data()) })
            } catch (err) {
                alert(err)
            }
        },
    }
}

export default activity

Вот компонент, в котором я использую FlatList :

import * as React from 'react';
import {
  Text,
  TouchableOpacity,
  View,
  FlatList,
  ImageBackground
}
  from 'react-native';
import styles from '../styles'
import { connect } from 'react-redux';
import '@expo/vector-icons';
import 'redux';

class Activities extends React.Component {
  state = {
    movetoArray: [],
    outputActivity: [],
  };

  async componentDidMount() {
    const activities = await this.props.getActivities()
    this.state.movetoArray = Object.values(activities)
    this.state.outputActivity = Object.entries(this.state.movetoArray[1]).map(item => ({ ...item[1], key: item[0] }));
    //this.state.arrayActivity = Object.entries(activities).map(item => ({...item[1], key: item[0]}));
    console.log(this.state.outputActivity)
  }

  _renderItem = ({ item }) => (
    <TouchableOpacity
      onPress={() => this.props.navigation.navigate('activitiesMD',
        {
          title: item.name,
          objectData: item.data
        })}>
      <ImageBackground source={item.image} style={styles.inputTiles} imageStyle={{ borderRadius: 10 }}>
        <View style={styles.inputTileTextView}>
          <Text style={[styles.inputTileText, { color: item.colour }]}>{item.name}</Text>
        </View>
      </ImageBackground>
    </TouchableOpacity>
  );

  render() {
    const { routeName } = this.props.navigation.state
    return (
      <View style={styles.container}>
        <FlatList
          data={this.state.outputActivity}
          keyExtractor={item => item.id}
          renderItem={this._renderItem}
        />
      </View>
    );
  }
}

const mapState = (state) => ({
  activity: state.activity,
})

const mapDispatch = (dispatch) => ({
  getActivities: () => dispatch.activity.getActivities(),
})

export default connect(mapState, mapDispatch)(Activities)

Я не знаю, почему я получаю такой результат. Пожалуйста, помогите мне :)

Outcome

1 Ответ

3 голосов
/ 14 ноября 2019

Если вы напрямую изменяете состояние в React, компонент не будет повторно визуализироваться. Пожалуйста, используйте this.setState({ ... }) вот так:

- this.state.movetoArray = Object.values(activities)
- this.state.outputActivity = Object.entries(this.state.movetoArray[1]).map(item => ({ ...item[1], key: item[0] }));

+ this.setState({ movetoArray: Object.values(activities), outputActivity: Object.entries(this.state.movetoArray[1]).map(item => ({ ...item[1], key: item[0] })) })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...