Skip to content

RN Lez 23: fetch GET

Docs: Network

  • Fare chiamate GET con fetch
  • Gestire loading, dati, errori
  • Mostrare dati da API in FlatList

Pattern standard per caricare dati all’avvio:

const [dati, setDati] = useState<any[]>([]);
const [loading, setLoading] = useState(true);
const [errore, setErrore] = useState<string | null>(null);
useEffect(() => {
const carica = async () => {
try {
const res = await fetch('https://api.esempio.com/dati');
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const json = await res.json();
setDati(json);
} catch (err) {
setErrore((err as Error).message);
} finally {
setLoading(false);
}
};
carica();
}, []);

if (loading) {
return (
<View style={styles.center}>
<ActivityIndicator size="large" color="#3498db" />
<Text style={{ marginTop: 10, color: 'grey' }}>Caricamento...</Text>
</View>
);
}
if (errore) {
return (
<View style={styles.center}>
<Text style={{ color: 'red', fontSize: 18 }}>{errore}</Text>
<Button title="Riprova" onPress={ricarica} />
</View>
);
}
return <FlatList data={dati} renderItem={renderItem} />;

import { useState, useEffect } from 'react';
import { View, Text, FlatList, ActivityIndicator, Button, StyleSheet } from 'react-native';
type Post = {
id: number;
title: string;
body: string;
};
export default function App() {
const [posts, setPosts] = useState<Post[]>([]);
const [loading, setLoading] = useState(true);
const [errore, setErrore] = useState<string | null>(null);
const carica = async () => {
setLoading(true);
setErrore(null);
try {
const res = await fetch('https://jsonplaceholder.typicode.com/posts?_limit=10');
if (!res.ok) throw new Error('Errore caricamento');
setPosts(await res.json());
} catch (err) {
setErrore((err as Error).message);
} finally {
setLoading(false);
}
};
useEffect(() => { carica(); }, []);
if (loading) return (
<View style={styles.center}><ActivityIndicator size="large" /><Text>Caricamento...</Text></View>
);
if (errore) return (
<View style={styles.center}>
<Text style={{ color: 'red', fontSize: 18 }}>{errore}</Text>
<Button title="Riprova" onPress={carica} />
</View>
);
return (
<View style={styles.container}>
<Text style={styles.titolo}>📰 Posts</Text>
<FlatList
data={posts}
renderItem={({ item }) => (
<View style={styles.card}>
<Text style={styles.id}>#{item.id}</Text>
<Text style={styles.title}>{item.title}</Text>
</View>
)}
keyExtractor={item => item.id.toString()}
/>
</View>
);
}

APIURLCosa restituisce
JSONPlaceholderjsonplaceholder.typicode.com/postsPosts, users
JSONPlaceholder usersjsonplaceholder.typicode.com/usersUtenti
Rick & Mortyrickandmortyapi.com/api/characterPersonaggi
Open-Meteoapi.open-meteo.com/v1/forecastMeteo (no API key)

PassaggioCodice
Chiamataconst res = await fetch(url)
JSONconst data = await res.json()
Controllo erroriif (!res.ok) throw Error()
LoadinguseState(true) → set a false dopo
ErroreuseState(null) → set messaggio

Crea un’app che carica utenti da https://jsonplaceholder.typicode.com/users e mostra:

  1. Nome (grassetto)
  2. Email (grigio)
  3. Telefono
  4. ActivityIndicator durante caricamento
  5. Gestione errore se fallisce
  6. Bottone “Riprova” in caso di errore