Реагировать на данные компонента Native FlatList, постоянно обновляющиеся после вызова данных Firebase, без согласованного отображения данных Firebase - PullRequest
0 голосов
/ 05 февраля 2020

Я пытаюсь создать плоский список в реагировать на родной, где отображаются сообщения с их информацией и информацией их пользователя. Все эти данные хранятся в базе данных. Я вызываю эти данные в переменную состояния данных с помощью следующей функции:

getPosts = (limit = 20) => {
    var list = [];
    firebase.firestore()
      .collection("posts").get().then((querySnapshot) => {
        querySnapshot.forEach(async (doc) => {
          var tempList = doc.data();
          const usersQs = await firebase.firestore().collection("users").where('email', '==', doc.data().email).get();
          usersQs.forEach(doc2 => {
            Object.assign(tempList, {
              "userName": doc2.data().name,
              "avatar": doc2.data().avatar
            });
          });

          list.push(tempList);
        });
        list.sort(function(a, b) {
          var c = b.timestamp;
          var d = a.timestamp;
          return c - d;
        });
        this.setState({
          data: list,
          fullData: list
        });
      });

    return new Promise((resolve, reject) => {
      this.func;
      resolve(_.take(this.state.fullData, limit));
    });
  };

Эта функция загружает правильные данные в состояние данных, но после того, как я пытаюсь загрузить эти данные в плоский список, который выглядит как this:

renderPost = post => {
    return (
      <View style={styles.feedItem}>
        <Image source={post.avatar} style={styles.avatar} />
        <View style={{ flex: 1 }}>
          <View style={{ flexDirection: "row", justifyContent: "space-between", alignItems: "center" }}>
            <View>
              <Text style={styles.name}>{post.userName}</Text>
              <Text style={styles.timestamp}>{moment(post.timestamp).fromNow()}</Text>
            </View>

            <Ionicons name="ios-more" size={24} color="#73788B" />
          </View>

          <Text style={styles.post}>{post.text}</Text>

          <Image source={post.image && {uri: post.image}} style={styles.postImage} resizeMode="cover" />

          <View style={{ flexDirection: "row" }}>
            <Ionicons name="ios-heart-empty" size={24} color="#73788B" style={{ marginRight: 16 }} />
            <Ionicons name="ios-chatboxes" size={24} color="#73788B" />
          </View>
        </View>
      </View>
    );
  };

  render() {
    return (
      <View style={styles.container}>
        <View style={styles.header}>
          <Text style={styles.headerTitle}>Feed</Text>
        </View>

        <FlatList
          style={styles.feed}
          data={this.state.data}
          renderItem={({ item }) => this.renderPost(item)}
          keyExtractor={item => item.timestamp.toString()}
          showsVerticalScrollIndicator={false}
          ListFooterComponent={this.renderFooter}
          refreshing={this.state.refreshing}
          onRefresh={this.handleRefresh}
          onEndReached={this.handleLoadMore}
          onEndThreshold={100}
        />
      </View>

Я вызываю функцию getPosts в следующем коде, который запускается при перезагрузке и refre sh:

  componentDidMount() {
    this.makeRemoteRequest();
  }
...
  makeRemoteRequest = _.debounce(() => {
    this.setState({ loading: true });

    this.getPosts(this.state.postNumLoad)
      .then(posts => {
        this.setState({
          loading: false,
          data: posts,
          fullData: posts,
          refreshing: false
        });
      })
      .catch(error => {
        this.setState({ error, loading: false, refreshing: false });
      });
  }, 250);

  handleRefresh = () => {
    this.setState({
      refreshing: true
    }, () => {
      this.makeRemoteRequest();
    });
  };

  handleLoadMore = () => {
    this.setState({
      postNumLoad: this.state.postNumLoad + 20
    }, () => {
      this.makeRemoteRequest();
    });
  };

Эти данные мигают после перезагрузки, но это не остается на экране последовательно. Когда я не перезагружаюсь, на экране ничего не появляется. Мое состояние выглядит следующим образом:

constructor(props) {
    super(props);

    this.state = {
      data: [],
      downloadImage: '../assets/images/temporaryProfilePicture.jpg',
      loading: false,
      error: null,
      fullData: [],
      refreshing: false,
      postNumLoad: 20
    };
  }

Мой вопрос в целом таков: как сделать так, чтобы данные в плоском списке постоянно оставались на экране, не перезагружая и не перезагружая данные? Любая помощь будет в значительной степени оценена. Заранее спасибо!

1 Ответ

1 голос
/ 05 февраля 2020

По моему опыту, FlatList работает лучше, если вы поместите setTimeout в функцию, которая вызывается onEndReached. Я постоянно обновляю FlatLists, потому что он не завершил загрузку большего количества данных, прежде чем onEndReached будет вызван снова. Предполагается, что в FlatList есть что-то встроенное, что предотвращает эту проблему, но это не всегда работает.

Использование bounces = {false} в FlatList также может помочь с этим, так как иногда отскок может вызывать onEndReached запускаться дважды подряд до завершения обновления FlatList.

Вот пример набора функций, которые я использую для onEndReached в одном из моих приложений:

gettingData(){

   this.setState({refreshing: true, showFooter: true});

       this.GetMyData().then(() => {
       this.setState({refreshing: false, showFooter: false, loading: false});
   });

     }


 waitingForData(){

   setTimeout(() => {
     if(this.state.showFooter === false && this.state.listData.length > 0){
       //console.log('getting after waiting');
       this.gettingData();
     }else{
       //console.log('waiting again');
       this.waitingForData();
     }
   }, 15000)

 }

_onEndList = () => {

  if(this.state.showFooter === false && this.state.listData.length > 0){
    //console.log('getting');
    this.gettingData();


  }else{
//console.log('waiting');
    this.waitingForData();
  }

}

Я не уверен, что ваша проблема с дисплеем вызвана тем же или нет , Если проблема не устранена после того, как исправлено постоянное обновление, попробуйте проверить, есть ли проблема в IOS и Android, или только в одном или другом.

Я помню такую ​​проблему только на Android. Я исправил это, поиграв с некоторыми стилями, которые конфликтовали с FlatList, но я не помню, что именно. Возможно, им приходилось скрывать переполнение, если это просто FlatList, который пуст.

Если весь экран, включая все остальные компоненты вне FlatList, также go пуст, я думаю, возможно, вам нужно обернуть весь экран во что-то с помощью flex: 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...