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, 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.
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ı, 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.
| Parametre | Varsayılan | Açıklama |
|---|---|---|
| windowSize | 21 | Render edilecek sayfa sayısı (1 sayfa = ekran yüksekliği) |
| initialNumToRender | 10 | İlk render'daki öğe sayısı |
| maxToRenderPerBatch | 10 | Toplu başına maksimum render edilen öğe |
| removeClippedSubviews | false | Ekran 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, 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.
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.
const styles = StyleSheet.create({
item: {
padding: 16,
backgroundColor: '#fff',
borderBottomWidth: 1,
borderBottomColor: '#e0e0e0',
},
separator: {
height: 1,
backgroundColor: '#ccc',
},
});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.
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.
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 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.
<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, 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.
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 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.
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, 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.
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, 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
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.
Ayrıca okuyun