App.js
1 <FlatList
2 data={frutas}
3 ...
4 />
FLATLIST
no React Native
Prof. Bruno Rover Dal Prá
O que vamos aprender
1
O problema
Por que listar itens com .map() dentro de um ScrollView não é uma boa ideia.
2
A anatomia
As três props essenciais do FlatList: data, renderItem e keyExtractor.
3
O código
Um exemplo completo, explicado parte por parte, e recursos extras do FlatList.
Introdução
FlatList no React Native
O que é o FlatList?
📱 Contato 1
📱 Contato 2
📱 Contato 3
📱 Contato 4
↕ tela visível
Conceito
FlatList no React Native
Por que não usar ScrollView + map()?
Ruim.js
1 <ScrollView>
2 {frutas.map((item) => (
3 <Text key={item.id}>
4 {item.nome}
5 </Text>
6 ))}
7 </ScrollView>
❌ Renderiza TODOS os itens de uma vez, mesmo os que estão fora da tela
Bom.js
1 <FlatList
2 data={frutas}
3 keyExtractor={(item) => item.id}
4 renderItem={({ item }) => (
5 <Text>{item.nome}</Text>
6 )}
7 />
✅ Renderiza só o que aparece na tela, sob demanda (virtualização)
Conceito
FlatList no React Native
As 3 props essenciais do FlatList
📦
data
O array com as informações que vão virar itens da lista (ex.: frutas, contatos, produtos).
🎨
renderItem
A função que diz como cada item deve aparecer na tela — roda uma vez para cada elemento do array.
🔑
keyExtractor
A função que devolve um identificador único (string) para cada item, ajudando o React a controlar a lista.
Anatomia do FlatList
FlatList no React Native
Exemplo completo
App.js
1 import { FlatList, Text, View } from 'react-native';
2
3 const frutas = [
4 { id: '1', nome: 'Banana' },
5 { id: '2', nome: 'Maçã' },
6 { id: '3', nome: 'Uva' },
7 { id: '4', nome: 'Laranja' },
8 ];
9
10 export default function App() {
11 return (
12 <FlatList
13 data={frutas}
14 keyExtractor={(item) => item.id}
15 renderItem={({ item }) => (
16 <View style={{ padding: 16 }}>
17 <Text style={{ fontSize: 18 }}>{item.nome}</Text>
18 </View>
19 )}
20 />
21 );
22 }
Exemplo completo
FlatList no React Native
1
Os dados (linhas 3 a 8)
App.js
1 import { FlatList, Text, View } from 'react-native';
2
3 const frutas = [
4 { id: '1', nome: 'Banana' },
5 { id: '2', nome: 'Maçã' },
6 { id: '3', nome: 'Uva' },
7 { id: '4', nome: 'Laranja' },
8 ];
9
10 export default function App() {
11 return (
12 <FlatList
13 data={frutas}
14 keyExtractor={(item) => item.id}
15 renderItem={({ item }) => (
16 <View style={{ padding: 16 }}>
17 <Text style={{ fontSize: 18 }}>{item.nome}</Text>
18 </View>
19 )}
20 />
21 );
22 }
Explicando o código
FlatList no React Native
2
A prop renderItem (linhas 15 a 19)
App.js
1 import { FlatList, Text, View } from 'react-native';
2
3 const frutas = [
4 { id: '1', nome: 'Banana' },
5 { id: '2', nome: 'Maçã' },
6 { id: '3', nome: 'Uva' },
7 { id: '4', nome: 'Laranja' },
8 ];
9
10 export default function App() {
11 return (
12 <FlatList
13 data={frutas}
14 keyExtractor={(item) => item.id}
15 renderItem={({ item }) => (
16 <View style={{ padding: 16 }}>
17 <Text style={{ fontSize: 18 }}>{item.nome}</Text>
18 </View>
19 )}
20 />
21 );
22 }
Explicando o código
FlatList no React Native
3
A prop keyExtractor (linha 14)
App.js
1 import { FlatList, Text, View } from 'react-native';
2
3 const frutas = [
4 { id: '1', nome: 'Banana' },
5 { id: '2', nome: 'Maçã' },
6 { id: '3', nome: 'Uva' },
7 { id: '4', nome: 'Laranja' },
8 ];
9
10 export default function App() {
11 return (
12 <FlatList
13 data={frutas}
14 keyExtractor={(item) => item.id}
15 renderItem={({ item }) => (
16 <View style={{ padding: 16 }}>
17 <Text style={{ fontSize: 18 }}>{item.nome}</Text>
18 </View>
19 )}
20 />
21 );
22 }
Explicando o código
FlatList no React Native
4
O componente FlatList (linhas 12 a 20)
App.js
1 import { FlatList, Text, View } from 'react-native';
2
3 const frutas = [
4 { id: '1', nome: 'Banana' },
5 { id: '2', nome: 'Maçã' },
6 { id: '3', nome: 'Uva' },
7 { id: '4', nome: 'Laranja' },
8 ];
9
10 export default function App() {
11 return (
12 <FlatList
13 data={frutas}
14 keyExtractor={(item) => item.id}
15 renderItem={({ item }) => (
16 <View style={{ padding: 16 }}>
17 <Text style={{ fontSize: 18 }}>{item.nome}</Text>
18 </View>
19 )}
20 />
21 );
22 }
Explicando o código
FlatList no React Native
E quando não existe um id no array?
App.js
1 const frutas = ['Banana', 'Maçã', 'Uva', 'Laranja'];
2
3 <FlatList
4 data={frutas}
5 keyExtractor={(item, index) => index.toString()}
6 renderItem={({ item }) => (
7 <Text>{item}</Text>
8 )}
9 />
keyExtractor sem id
FlatList no React Native
PARA IR ALÉM
Recursos extras do FlatList
Props que resolvem problemas comuns do dia a dia
Cabeçalho, rodapé e lista vazia
App.js
1 <FlatList
2 data={frutas}
3 ListHeaderComponent={
4 <Text>Frutas</Text>
5 }
6 ListEmptyComponent={
7 <Text>Nada encontrado</Text>
8 }
9 ...
10 />
Recursos extras
FlatList no React Native
Separador, lista horizontal e grade
App.js
1 <FlatList
2 data={frutas}
3 numColumns={2}
4 ItemSeparatorComponent={() => (
5 <View style={{ height: 8 }} />
6 )}
7 ...
8 />
Recursos extras
FlatList no React Native
Carregando mais itens ao rolar
App.js
1 <FlatList
2 data={frutas}
3 onEndReached={buscarMaisFrutas}
4 onEndReachedThreshold={0.5}
5 ...
6 />
Recursos extras
FlatList no React Native
Erros comuns ao usar o FlatList
✕
Esquecer o keyExtractor
O React mostra um aviso no console e pode ter problemas de performance ou de identificação dos itens.
✕
Usar o índice (index) como chave
Se a lista muda de ordem ou ganha/perde itens, o React pode confundir qual item é qual.
✕
Modificar o array direto (frutas.push())
Mutar o array não avisa o React de nada — crie sempre um array novo com o item adicionado.
✕
Colocar FlatList dentro de ScrollView
Isso quebra a virtualização (o motivo de usar FlatList) e gera avisos no console.
Boas práticas
FlatList no React Native
Resumo do que aprendemos
1
Por que FlatList
Renderiza só os itens visíveis na tela (virtualização) — muito mais leve que ScrollView + map()
2
As 3 props essenciais
data (o array), renderItem (como desenhar) e keyExtractor (identidade única de cada item)
3
Recursos extras
ListHeaderComponent, ListEmptyComponent, ItemSeparatorComponent, numColumns, onEndReached e mais
Revisão
FlatList no React Native