FlatList: шта је то, API и оптимизација у React Native

Аутор: IT Sectr Објављено: 2026-07-05 Време читања: 10 мин

FlatList — основни React Native компонент за приказ продуктивних листа са виртуелизацијом елемената. За разлику од ScrollView, FlatList рендерује само видљиве елементе екрана, штедећи меморију и процесор. Компонент подржава хоризонтално и вертикално скроловање, pull-to-refresh и бесконачно учитавање. Више о архитектури листа прочитајте у Meta документацији.

Главне тачке

  • FlatList — виртуелизовани компонент листе који рендерује само видљиве елементе и поново их користи при скроловању
  • Перформансе се постижу прозорским рендеровањем (windowing) — елементи ван екрана се не креирају
  • API укључује renderItem, keyExtractor, ItemSeparatorComponent, ListHeaderComponent и ListFooterComponent
  • Хоризонталне листе се подешавају преко флага horizontal и мењају правац скроловања на осу X
  • Оптимизација захтева правилно подешавање keyExtractor, useMemo за податке и getItemLayout за фиксне величине

Шта је FlatList?

FlatList — React Native компонент који имплементира виртуелизовану листу са продуктивним рендеровањем великих количина података. Компонент је изграђен на бази VirtualizedList и пружа декларативни API за креирање равних листа било које сложености.

FlatList се појавио у React Native 0.43 као замена за застарели ListView. Према Meta подацима (2026), FlatList се користи у 85% React Native апликација које раде са листама. Компонент подржава све уобичајене сценарије: контакте, вести феедове, каталоге производа, ћаскања.

Историја и место у екосистему

Пре појаве FlatList, програмери су користили ListView, који је захтевао ручно подешавање поновне употребе ћелија. FlatList је аутоматизовао овај процес, уводећи прозорско рендеровање слично RecyclerView у Android-у (2014) и UICollectionView у iOS-у (2012). У модерним пројектима, FlatList је дефакто стандард за све листе.

Како функционише виртуелизација FlatList

Виртуелизација FlatList — механизам у ком компонент рендерује само елементе који се налазе у видљивом делу екрана, плус мали бафер са сваке стране. Остали елементи се не креирају у DOM-у, што штеди меморију и убрзава рендеровање.

При скроловању, FlatList поново користи већ креиране View ћелије, замењујући податке у њима. Ово спречава креирање хиљада View-ова за листу од 10 000 елемената. Подразумевана величина бафера је 10 елемената изнад и испод видљивог подручја, али се може подесити преко windowSize.

ПараметарПодразумеваноОпис
windowSize21Број страница за рендеровање (1 страница = висина екрана)
initialNumToRender10Број елемената при првом рендеру
maxToRenderPerBatch10Максимум елемената рендерованих у једној серији
removeClippedSubviewsfalseУклањање View-ова ван екрана из хијерархије

Оптимално подешавање ових параметара омогућава балансирање између глаткоће скроловања и потрошње меморије. За листе са великим елементима препоручује се смањење windowSize на 5-7.

API и главни пропсови FlatList

FlatList API укључује скуп пропсова за подешавање изгледа и понашања листе. Два обавезна пропса — data (низ података) и renderItem (функција рендеровања елемента). keyExtractor повећава перформансе пружајући јединствени кључ за сваки елемент.

js
import React from 'react';
import { FlatList, View, Text, StyleSheet } from 'react-native';

const App = () => {
  const data = Array.from({ length: 100 }, (_, i) => ({
    id: i.toString(),
    title: `Item #${i + 1}`,
  }));

  return (
    <FlatList
      data={data}
      renderItem={({ item }) => (
        <View style={styles.item}>
          <Text>{item.title}</Text>
        </View>
      )}
      keyExtractor={item => item.id}
      ItemSeparatorComponent={() => <View style={styles.separator} />}
    />
  );
};

ItemSeparatorComponent додаје раздвајач између елемената, ListHeaderComponent и ListFooterComponent — заглавље и подножје листе. Ово омогућава креирање сложених распореда без додатног омотача.

js
const styles = StyleSheet.create({
  item: {
    padding: 16,
    backgroundColor: '#fff',
    borderBottomWidth: 1,
    borderBottomColor: '#e0e0e0',
  },
  separator: {
    height: 1,
    backgroundColor: '#ccc',
  },
});

Оптимизација перформанси FlatList

Оптимизација FlatList је критично важна за апликације са стотинама и хиљадама елемената. Без правилног подешавања, листа може да успори при скроловању, троши прекомерну меморију и изазива падове на слабијим уређајима.

Прво правило — коришћење keyExtractor са јединственим и стабилним идентификаторима. Индекси као кључеви доводе до нетачног поновног коришћења ћелија и грешака у стању. Друго — умотавање renderItem у useCallback и коришћење React.memo за компонент елемента.

getItemLayout за фиксну висину

Ако сви елементи имају исту висину, getItemLayout омогућава FlatList-у да израчуна позицију скроловања без мерења компонената. Ово даје значајан пораст перформанси, посебно при скроловању до одређеног индекса.

js
const ITEM_HEIGHT = 80;

const getItemLayout = (data, index) => ({
  length: ITEM_HEIGHT,
  offset: ITEM_HEIGHT * index,
  index,
});

<FlatList
  data={data}
  getItemLayout={getItemLayout}
  renderItem={renderItem}
/FlatList>

useMemo за податке спречава непотребна поновна рендеровања. Ако подаци долазе из API-ја, обрадите их једном и кеширајте. Користите React.memo за компонент елемента да бисте избегли рендеровање непромењених елемената.

Хоризонталне листе и карусели

Хоризонтални FlatList се креира додавањем пропса horizontal={true}. Листа мења правац скроловања на осу X, што је згодно за каруселе производа, галерије слика и хоризонталне меније.

У хоризонталном режиму важно је правилно подесити snapToInterval и snapToAlignment за корачно скроловање, као у изворним каруселима. Компонент аутоматски обрађује момент и пуштање прста, заустављајући се на најближем елементу.

js
<FlatList
  horizontal
  data={images}
  renderItem={renderItem}
  keyExtractor={item => item.id}
  showsHorizontalScrollIndicator={false}
  snapToInterval={CARD_WIDTH + GAP}
  snapToAlignment="start"
  decelerationRate="fast"
  pagingEnabled
  onViewableItemsChanged={onViewableItemsChanged}
/>

onViewableItemsChanged — callback који се позива при промени видљивих елемената. Користи се за аналитику, лењо учитавање слика и активирање видеа само за видљиве картице.

Pull-to-refresh и бесконачно учитавање

Pull-to-refresh у FlatList-у се имплементира преко пропсова refreshing и onRefresh, који раде у пару са стањем учитавања. При повлачењу листе наниже позива се onRefresh, а флаг refreshing блокира поновне позиве.

Бесконачно учитавање (infinite scroll) се подешава преко onEndReached — callback-а који се активира при приближавању крају листе. onEndReachedThreshold одређује колико елемената пре краја активира догађај. За пагинацију се обично користи cursor-based приступ.

js
const ListWithPagination = () => {
  const [data, setData] = React.useState([]);
  const [page, setPage] = React.useState(1);
  const [refreshing, setRefreshing] = React.useState(false);

  const loadMore = React.useCallback(async () => {
    const newData = await fetchPage(page);
    setData(prev => [...prev, ...newData]);
    setPage(p => p + 1);
  }, [page]);

  return (
    <FlatList
      data={data}
      renderItem={renderItem}
      keyExtractor={item => item.id}
      refreshing={refreshing}
      onRefresh={loadMore}
      onEndReached={loadMore}
      onEndReachedThreshold={0.5}
    />
  );
};

Важно: onEndReached се може позвати више пута. Додајте флаг isLoading за блокирање поновних захтева док се претходни не заврши. Користите ActivityIndicator у ListFooterComponent за приказ учитавања.

Често постављана питања

По чему се FlatList разликује од ScrollView?

FlatList користи виртуелизацију — рендерује само видљиве елементе, што штеди меморију код великих података. ScrollView рендерује све подређене елементе одједном, погодан само за мале листе до 20-30 елемената. FlatList је оптималан за 100+ елемената.

Како поправити трептање (flash) при ажурирању података FlatList-а?

Трептање настаје при промени референце низа data. Користите extraData, преносећи зависност тамо, или умотајте renderItem у React.memo. За потпуну контролу примените useMemo за стабилизацију референци података.

Зашто FlatList не скролује унутар другог scroll-view-а?

FlatList није намењен за уметање у ScrollView због конфликта гестова. Решења: користите FlatList са nestedScrollEnabled (Android), SectionList за секције или изнесите спољашње скроловање у FlatList преко ListHeaderComponent.

Како анимирати појављивање елемената FlatList-а?

Користите Animated API унутар renderItem-а са кашњењем на основу индекса. При скроловању примените onViewableItemsChanged за покретање анимације. Библиотеке react-native-reanimated и react-native-lottie поједностављују креирање сложених анимација појављивања.

Шта је VirtualizedList и како је повезан са FlatList-ом?

VirtualizedList — основни компонент виртуелизације на ком су изграђени FlatList и SectionList. FlatList је омотач VirtualizedList-а са поједностављеним API-јем за равне листе. VirtualizedList пружа контролу нижег нивоа, али се ретко користи директно.

Закључак

  • FlatList — основни React Native компонент за продуктивне листе са аутоматском виртуелизацијом и поновном употребом ћелија
  • Виртуелизација рендерује само видљиве елементе кроз windowSize и initialNumToRender, штедећи меморију на великим скуповима података
  • Обавезни пропсови: data, renderItem и keyExtractor — обезбеђују исправан рад листе
  • getItemLayout убрзава скроловање за елементе са фиксном висином, елиминишући динамичко мерење
  • Хоризонталне листе и карусели се подешавају преко horizontal и snapToInterval за корачно скроловање
  • Pull-to-refresh и onEndReached имплементирају бесконачно учитавање са заштитом од поновних позива
  • React.memo и useCallback су обавезни за renderItem — без њих свако скроловање изазива поновно рендеровање свих елемената

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође