FlatList: co to je, API a optimalizace v React Native

Autor: IT Sectr Publikováno: 2026-07-05 Doba čtení: 10 min

FlatList — hlavní komponenta React Native pro zobrazení výkonných seznamů s virtualizací prvků. Na rozdíl od ScrollView, FlatList vykresluje pouze viditelné prvky obrazovky, čímž šetří paměť a procesor. Komponenta podporuje horizontální a vertikální posouvání, pull-to-refresh a nekonečné načítání. Více o architektuře seznamů si přečtěte v dokumentaci Meta.

Hlavní body

  • FlatList — virtualizovaná komponenta seznamu, která vykresluje pouze viditelné prvky a při posouvání je znovu používá
  • Výkon je dosažen pomocí okenního vykreslování (windowing) — prvky mimo obrazovku se nevytvářejí
  • API zahrnuje renderItem, keyExtractor, ItemSeparatorComponent, ListHeaderComponent a ListFooterComponent
  • Horizontální seznamy se konfigurují pomocí příznaku horizontal a mění směr posouvání na osu X
  • Optimalizace vyžaduje správnou konfiguraci keyExtractor, useMemo pro data a getItemLayout pro pevné velikosti

Co je FlatList?

FlatList — komponenta React Native, která implementuje virtualizovaný seznam s výkonným vykreslováním velkého množství dat. Komponenta je postavena na VirtualizedList a poskytuje deklarativní API pro vytváření plochých seznamů libovolné složitosti.

FlatList se objevil v React Native 0.43 jako náhrada za zastaralý ListView. Podle dat Meta (2026) se FlatList používá v 85% aplikací React Native pracujících se seznamy. Komponenta podporuje všechny běžné scénáře: kontakty, zpravodajské kanály, katalogy produktů, chaty.

Historie a místo v ekosystému

Před příchodem FlatList vývojáři používali ListView, který vyžadoval ruční konfiguraci opětovného použití buněk. FlatList tento proces automatizoval zavedením okenního vykreslování podobného RecyclerView v Androidu (2014) a UICollectionView v iOS (2012). V moderních projektech je FlatList de facto standardem pro všechny seznamy.

Jak funguje virtualizace FlatList

Virtualizace FlatList — mechanismus, při kterém komponenta vykresluje pouze prvky nacházející se ve viditelné oblasti obrazovky, plus malý buffer na každé straně. Zbývající prvky se nevytvářejí v DOM, což šetří paměť a zrychluje vykreslování.

Při posouvání FlatList znovu používá již vytvořené View buňky a nahrazuje v nich data. To zabraňuje vytváření tisíců View pro seznam 10 000 prvků. Výchozí velikost bufferu je 10 prvků nad a pod viditelnou oblastí, ale lze ji konfigurovat pomocí windowSize.

ParametrVýchozíPopis
windowSize21Počet stránek pro vykreslování (1 stránka = výška obrazovky)
initialNumToRender10Počet prvků při prvním vykreslení
maxToRenderPerBatch10Maximální počet prvků vykreslených v jedné dávce
removeClippedSubviewsfalseOdstranění View mimo obrazovku z hierarchie

Optimální konfigurace těchto parametrů umožňuje vyvážit plynulost posouvání a spotřebu paměti. Pro seznamy s velkými prvky se doporučuje snížit windowSize na 5-7.

API a hlavní props FlatList

API FlatList zahrnuje sadu props pro konfiguraci vzhledu a chování seznamu. Dva povinné props — data (pole dat) a renderItem (funkce pro vykreslení prvku). keyExtractor zvyšuje výkon poskytnutím jedinečného klíče pro každý prvek.

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 přidává oddělovač mezi prvky, ListHeaderComponent a ListFooterComponent — záhlaví a zápatí seznamu. To umožňuje vytvářet složitá rozvržení bez dodatečného obalu.

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

Optimalizace výkonu FlatList

Optimalizace FlatList je kriticky důležitá pro aplikace se stovkami a tisíci prvků. Bez správné konfigurace může seznam při posouvání zpomalovat, spotřebovávat nadměrnou paměť a způsobovat pády na slabších zařízeních.

První pravidlo — používejte keyExtractor s jedinečnými a stabilními identifikátory. Indexy jako klíče vedou k nesprávnému opětovnému použití buněk a chybám stavu. Druhé — obalte renderItem do useCallback a použijte React.memo pro komponentu prvku.

getItemLayout pro pevnou výšku

Pokud mají všechny prvky stejnou výšku, getItemLayout umožňuje FlatList vypočítat pozici posouvání bez měření komponent. To poskytuje výrazné zvýšení výkonu, zejména při posouvání na konkrétní index.

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 pro data zabraňuje zbytečnému překreslování. Pokud data přicházejí z API, transformujte je jednou a uložte do mezipaměti. Používejte React.memo pro komponentu prvku, abyste předešli vykreslování nezměněných prvků.

Horizontální seznamy a karusely

Horizontální FlatList se vytvoří přidáním props horizontal={true}. Seznam mění směr posouvání na osu X, což je vhodné pro karusely produktů, galerie obrázků a horizontální menu.

V horizontálním režimu je důležité správně nakonfigurovat snapToInterval a snapToAlignment pro postupné posouvání, jako u nativních karuselů. Komponenta automaticky zpracovává hybnost a uvolnění prstu, zastavuje se u nejbližšího prvku.

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 volaný při změně viditelných prvků. Používá se pro analytiku, líné načítání obrázků a aktivaci videa pouze pro viditelné karty.

Pull-to-refresh a nekonečné načítání

Pull-to-refresh ve FlatList se implementuje pomocí props refreshing a onRefresh, které pracují společně se stavem načítání. Při tažení seznamu dolů se volá onRefresh a příznak refreshing blokuje opakovaná volání.

Nekonečné načítání (infinite scroll) se konfiguruje přes onEndReached — callback spouštěný při přiblížení ke konci seznamu. onEndReachedThreshold určuje, kolik prvků před koncem spouští událost. Pro stránkování se obvykle používá cursor-based přístup.

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}
    />
  );
};

Důležité: onEndReached může být volán opakovaně. Přidejte příznak isLoading pro blokování opakovaných požadavků, dokud se předchozí nedokončí. Použijte ActivityIndicator v ListFooterComponent pro indikaci načítání.

Často kladené otázky

Čím se FlatList liší od ScrollView?

FlatList používá virtualizaci — vykresluje pouze viditelné prvky, což šetří paměť u velkých dat. ScrollView vykresluje všechny podřízené prvky najednou, je vhodný jen pro malé seznamy do 20-30 prvků. FlatList je optimální pro 100+ prvků.

Jak opravit blikání (flash) při aktualizaci dat FlatList?

Blikání vzniká při změně reference pole data. Použijte extraData, přenášejte závislost tam, nebo obalte renderItem do React.memo. Pro úplnou kontrolu aplikujte useMemo pro stabilizaci referencí dat.

Proč se FlatList neposouvá uvnitř jiného scroll-view?

FlatList není určen pro vnoření do ScrollView kvůli konfliktu gest. Řešení: použijte FlatList s nestedScrollEnabled (Android), SectionList pro sekce nebo přeneste vnější posouvání do FlatList přes ListHeaderComponent.

Jak animovat zobrazování prvků FlatList?

Použijte Animated API uvnitř renderItem se zpožděním na základě indexu. Při posouvání aplikujte onViewableItemsChanged pro spuštění animace. Knihovny react-native-reanimated a react-native-lottie zjednodušují vytváření složitých animací zobrazení.

Co je VirtualizedList a jak souvisí s FlatList?

VirtualizedList — základní komponenta virtualizace, na které jsou postaveny FlatList a SectionList. FlatList je obal VirtualizedList se zjednodušeným API pro ploché seznamy. VirtualizedList poskytuje nižší úroveň řízení, ale zřídka se používá přímo.

Shrnutí

  • FlatList — hlavní komponenta React Native pro výkonné seznamy s automatickou virtualizací a opětovným použitím buněk
  • Virtualizace vykresluje pouze viditelné prvky přes windowSize a initialNumToRender, šetří paměť na velkých datových sadách
  • Povinné props: data, renderItem a keyExtractor — zajišťují správnou funkci seznamu
  • getItemLayout zrychluje posouvání pro prvky s pevnou výškou, odstraňuje dynamické měření
  • Horizontální seznamy a karusely se konfigurují přes horizontal a snapToInterval pro postupné posouvání
  • Pull-to-refresh a onEndReached implementují nekonečné načítání s ochranou proti opakovaným voláním
  • React.memo a useCallback jsou povinné pro renderItem — bez nich každé posouvání způsobuje překreslení všech prvků

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také