FlatList: nedir, React Native'de API ve optimizasyon

Yazar: IT Sectr Yayınlanma: 2026-07-05 Okuma süresi: 10 dk

FlatList, öğe sanallaştırması ile yüksek performanslı listeler görüntülemek için React Native'in ana bileşenidir. ScrollView'un aksine FlatList, yalnızca görünür ekran öğelerini render ederek bellek ve CPU tasarrufu sağlar. Bileşen, yatay ve dikey kaydırma, çek-yenile ve sonsuz yüklemeyi destekler. Liste mimarisi hakkında daha fazla bilgi için Meta dokümantasyonuna bakın.

Önemli noktalar

  • FlatList, yalnızca görünür öğeleri render eden ve kaydırma sırasında bunları yeniden kullanan sanallaştırılmış bir liste bileşenidir
  • Performans, pencereli render ile elde edilir — ekran dışındaki öğeler oluşturulmaz
  • API, renderItem, keyExtractor, ItemSeparatorComponent, ListHeaderComponent ve ListFooterComponent'i içerir
  • Yatay listeler horizontal bayrağı ile yapılandırılır ve kaydırma yönünü X eksenine değiştirir
  • Optimizasyon, keyExtractor'ın doğru yapılandırılmasını, veriler için useMemo'yu ve sabit boyutlar için getItemLayout'u gerektirir

FlatList nedir?

FlatList, büyük veri kümelerinin yüksek performanslı render edilmesiyle sanallaştırılmış bir liste uygulayan React Native bileşenidir. Bileşen, VirtualizedList üzerine inşa edilmiştir ve her karmaşıklıkta düz listeler oluşturmak için bildirimsel bir API sağlar.

FlatList, React Native 0.43'te kullanımdan kaldırılan ListView'in yerini almak üzere tanıtıldı. Meta'ya (2026) göre FlatList, listelerle çalışan React Native uygulamalarının %85'inde kullanılmaktadır. Bileşen, tüm yaygın senaryoları destekler: kişiler, haber akışları, ürün katalogları ve sohbetler.

Tarihçe ve ekosistemdeki yeri

FlatList'ten önce geliştiriciler, manuel hücre yeniden kullanım yapılandırması gerektiren ListView'i kullanıyordu. FlatList, Android'deki RecyclerView (2014) ve iOS'teki UICollectionView'e (2012) benzer pencereli render uygulayarak bu süreci otomatikleştirdi. Modern projelerde FlatList, her liste için fiili standarttır.

FlatList sanallaştırması nasıl çalışır

FlatList sanallaştırması, bileşenin yalnızca ekranın görünür alanına düşen öğeleri ve her iki tarafta küçük bir arabelleği render ettiği bir mekanizmadır. Kalan öğeler DOM'da oluşturulmaz, bu da bellek tasarrufu sağlar ve render'ı hızlandırır.

Kaydırma sırasında FlatList, önceden oluşturulmuş View hücrelerini yeniden kullanarak verilerini değiştirir. Bu, 10.000 öğelik bir liste için binlerce View oluşturulmasını önler. Varsayılan arabellek boyutu, görünür alanın üstünde ve altında 10 öğedir, ancak windowSize aracılığıyla yapılandırılabilir.

ParametreVarsayılanAçıklama
windowSize21Render edilecek sayfa sayısı (1 sayfa = ekran yüksekliği)
initialNumToRender10İlk render'daki öğe sayısı
maxToRenderPerBatch10Toplu başına maksimum render edilen öğe
removeClippedSubviewsfalseEkran dışındaki View'leri hiyerarşiden kaldır

Bu parametrelerin optimum yapılandırması, kaydırma akıcılığı ve bellek tüketimi arasında denge kurmayı sağlar. Büyük öğeleri olan listeler için windowSize'in 5-7'ye düşürülmesi önerilir.

FlatList API ve temel prop'lar

FlatList API, liste görüntüleme ve davranışını yapılandırmak için bir dizi prop içerir. İki zorunlu prop, data (veri dizisi) ve renderItem'dır (öğe render işlevi). keyExtractor, her öğe için benzersiz bir anahtar sağlayarak performansı artırır.

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 öğeler arasına ayırıcı ekler, ListHeaderComponent ve ListFooterComponent listeye başlık ve altbilgi ekler. Bu, ek sarmalayıcılar olmadan karmaşık düzenler oluşturmayı sağlar.

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

FlatList performans optimizasyonu

FlatList optimizasyonu, yüzlerce ve binlerce öğeye sahip uygulamalar için kritiktir. Doğru yapılandırma olmadan liste kaydırma sırasında yavaşlayabilir, aşırı bellek tüketebilir ve düşük güçlü cihazlarda çökmelere neden olabilir.

İlk kural, benzersiz ve kararlı tanımlayıcılarla keyExtractor kullanmaktır. Dizinleri anahtar olarak kullanmak, yanlış hücre yeniden kullanımına ve durum hatalarına yol açar. İkinci kural, renderItem'ı useCallback ile sarmak ve öğe bileşeni için React.memo kullanmaktır.

Sabit yükseklik için getItemLayout

Tüm öğeler aynı yüksekliğe sahipse, getItemLayout FlatList'in bileşenleri ölçmeden kaydırma konumunu hesaplamasını sağlar. Bu, özellikle belirli bir dizine kaydırma yaparken önemli bir performans artışı sağlar.

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>

Veriler için useMemo gereksiz yeniden render'ları önler. Veriler bir API'den geliyorsa, bir kez dönüştürün ve önbelleğe alın. Değişmeyen öğelerin render edilmesini önlemek için öğe bileşeni için React.memo kullanın.

Yatay listeler ve karuseller

Yatay FlatList, horizontal={true} prop'u eklenerek oluşturulur. Liste, kaydırma yönünü X eksenine değiştirir; bu, ürün karuselleri, resim galerileri ve yatay menüler için kullanışlıdır.

Yatay modda, yerel karusellerde olduğu gibi adım adım kaydırma için snapToInterval ve snapToAlignment'ı doğru yapılandırmak önemlidir. Bileşen, momentumu ve parmak kaldırmayı otomatik olarak işler ve en yakın öğede durur.

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, görünür öğeler değiştiğinde tetiklenen bir geri çağrıdır. Analitik, tembel resim yükleme ve yalnızca görünür kartlar için video etkinleştirme amacıyla kullanılır.

Çek-yenile ve sonsuz kaydırma

Çek-yenile, FlatList'te refreshing ve onRefresh prop'ları aracılığıyla uygulanır ve bir yükleme durumuyla birlikte çalışır. Liste aşağı çekildiğinde onRefresh çağrılır ve refreshing bayrağı tekrarlanan çağrıları engeller.

Sonsuz kaydırma, onEndReached aracılığıyla yapılandırılır — listenin sonuna yaklaşıldığında tetiklenen bir geri çağrı. onEndReachedThreshold, olayın sınırdan kaç öğe önce tetikleneceğini belirler. Genellikle imleç tabanlı sayfalama kullanılır.

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

Önemli: onEndReached birden çok kez çağrılabilir. Önceki istek tamamlanana kadar tekrarlanan istekleri engellemek için bir isLoading bayrağı ekleyin. Yüklemeyi belirtmek için ListFooterComponent'te ActivityIndicator kullanın.

Sıkça sorulan sorular

FlatList, ScrollView'dan nasıl farklıdır?

FlatList sanallaştırma kullanır — yalnızca görünür öğeleri render eder, büyük veri kümelerinde bellek tasarrufu sağlar. ScrollView tüm alt öğeleri aynı anda render eder, yalnızca 20-30 öğelik küçük listeler için uygundur. FlatList, 100+ öğe için idealdir.

FlatList verileri güncellenirken oluşan yanıp sönme nasıl düzeltilir?

Veri dizisi referansı değiştiğinde yanıp sönme oluşur. Bağımlılığı ileten extraData kullanın veya renderItem'ı React.memo ile sarın. Tam kontrol için, veri referanslarını stabilize etmek amacıyla useMemo kullanın.

FlatList neden başka bir kaydırma görünümünün içinde kaydırılmaz?

FlatList, jest çakışmaları nedeniyle ScrollView içine yerleştirilmek üzere tasarlanmamıştır. Çözümler: nestedScrollEnabled (Android) ile FlatList kullanın, bölümler için SectionList kullanın veya ListHeaderComponent aracılığıyla harici kaydırmayı FlatList'e taşıyın.

FlatList öğelerinin görünümü nasıl canlandırılır?

Dizine dayalı gecikmeyle renderItem içinde Animated API kullanın. Kaydırma sırasında, animasyonları tetiklemek için onViewableItemsChanged kullanın. react-native-reanimated ve react-native-lottie kütüphaneleri, karmaşık görünüm animasyonları oluşturmayı kolaylaştırır.

VirtualizedList nedir ve FlatList ile ilişkisi nedir?

VirtualizedList, FlatList ve SectionList'in üzerine inşa edildiği temel sanallaştırma bileşenidir. FlatList, düz listeler için basitleştirilmiş bir API ile VirtualizedList'in bir sarmalayıcısıdır. VirtualizedList, daha düşük seviyeli kontrol sağlar ancak nadiren doğrudan kullanılır.

Özet

  • FlatList, otomatik sanallaştırma ve hücre yeniden kullanımı ile React Native'de yüksek performanslı listeler için ana bileşendir
  • Sanallaştırma, windowSize ve initialNumToRender aracılığıyla yalnızca görünür öğeleri render ederek büyük veri kümelerinde bellek tasarrufu sağlar
  • Zorunlu prop'lar: data, renderItem ve keyExtractor — listenin doğru çalışmasını sağlar
  • getItemLayout, dinamik ölçümü ortadan kaldırarak sabit yükseklikteki öğeler için kaydırmayı hızlandırır
  • Yatay listeler ve karuseller, adım adım kaydırma için horizontal ve snapToInterval aracılığıyla yapılandırılır
  • Çek-yenile ve onEndReached, tekrarlanan çağrılara karşı koruma ile sonsuz yüklemeyi uygular
  • React.memo ve useCallback renderItem için zorunludur — bunlar olmadan her kaydırma tüm öğelerin yeniden render edilmesine neden olur

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun