Проблема с производительностью flatList в React Native

Я пробовал плоский список, но у него есть проблемы с производительностью в Android.

  1. Когда я прокручиваю вниз, он загружает список. Но после этого он отображается пустым при прокрутке вверх.

  2. Достигнув конца экрана, он на некоторое время останавливается, а затем загружает данные. Почему внизу не отображается загрузчик (индикатор активности)? Почему не работают onEndReached и onEndReachedThreshold?

Пожалуйста, посмотрите видео здесь

https://youtu.be/5tkkEAUEAHM

Мой код:

import React, { Component } from 'react';
import {
  AppRegistry,
  StyleSheet,
  Text,
  View,
  FlatList,
  ActivityIndicator,
} from 'react-native';
import { List, ListItem, SearchBar } from "react-native-elements";

export default class FlatListExample extends Component
{
constructor(props) {
    super(props);

    this.state = {
      loading: false,
      data: [],
      page: 1,
      seed: 1,
      error: null,
      refreshing: false,
    };
  }

  componentDidMount() {
    this.makeRemoteRequest();
  }

  makeRemoteRequest = () => {
    const { page, seed } = this.state;
    const url = `https://randomuser.me/api/?seed=${seed}&page=${page}&results=20`;
    console.log('url', url);
    this.setState({ loading: true });

    setTimeout(()=>{
      fetch(url)
        .then(res => res.json())
        .then(res => {
          this.setState({
            data:  [...this.state.data, ...res.results],
            error: res.error || null,
            loading: false,
            refreshing: false
          });
        })
        .catch(error => {
          this.setState({ error, loading: false });
        });
    },0);

  };

  renderFooter = () => {
    if (!this.state.loading) return null;

    return (
      <View
        style={{
          paddingVertical: 20,
          borderTopWidth: 1,
          borderColor: "#CED0CE"
        }}
      >
        <ActivityIndicator animating size="large" />
      </View>
    );
  };

handleLoadMore = () =>{
  this.setState({
    page:this.state.page + 1,
  },()=>{
    this.makeRemoteRequest();
  })
}
  render() {
    return (
      <FlatList
        data={this.state.data}
        renderItem={({ item }) => (
          <ListItem
            roundAvatar
            title={`${item.name.first} ${item.name.last}`}
            subtitle={item.email}
            avatar={{ uri: item.picture.thumbnail }}
          />
        )}
        keyExtractor={item => item.email}
        ListFooterComponent={this.renderFooter}
        onEndReached={this.handleLoadMore}
        onEndReachedThreshold={50}
      />
    );
  }
}

AppRegistry.registerComponent('FlatListExample', () => FlatListExample);

person Amrita Stha    schedule 28.05.2017    source источник


Ответы (1)


Я заметил, что вы не устанавливаете initialNumToRender. Из документов:

initialNumToRender: число

Сколько элементов визуализировать в исходном пакете. Этого должно быть достаточно, чтобы заполнить экран, но не более того. Обратите внимание, что эти элементы никогда не будут демонтированы как часть оконного рендеринга, чтобы улучшить воспринимаемую производительность действий с прокруткой вверх.

Итак, вы захотите оценить, сколько ячеек, по вашему мнению, будет видно в любой момент времени, и установите это значение. Я также рекомендую, если вы еще не обновились до последней версии react-native, которая включает различные улучшения в компоненте FlatList.

person sooper    schedule 28.05.2017
comment
Спасибо, супер. У меня последняя версия - react-native: 0.44.0. initialNumToRender решает пустую проблему. Но у меня есть еще одна проблема. Когда прокрутка достигает конца экрана, загрузка данных занимает некоторое время. Бесконечная прокрутка не работает. Иногда можно увидеть загрузчик, но чаще всего этого не происходит. onEndReached и onEndReachedThreshold работают некорректно. youtu.be/rTw935FURQY - person Amrita Stha; 29.05.2017
comment
Возможно, вы захотите проверить проблемы в проекте реакции-навигации и посмотреть, испытывает ли кто-нибудь то же самое. - person sooper; 29.05.2017
comment
Версия 0.44.1 теперь доступна и включает это исправление - person sooper; 29.05.2017