# React Native e GraphQL nel 2026: Apollo Client, Query e Domande da Colloquio > Integrazione di GraphQL con React Native utilizzando Apollo Client 4.0. Questo tutorial copre query, mutation, strategie di caching e domande comuni sui colloqui per lo sviluppo mobile GraphQL. - Published: 2026-08-20 - Updated: 2026-08-20 - Author: Anthony Fillion-Maillet - Tags: react-native, graphql, apollo-client, mobile, api, interview - Reading time: 9 min --- GraphQL è diventato il livello API preferito per le applicazioni React Native che richiedono un recupero dati flessibile e un utilizzo efficiente della rete. Apollo Client 4.0, rilasciato alla fine del 2025, porta un'architettura più snella con bundle ridotti del 20-30% e un supporto TypeScript migliorato, progettato specificamente per gli ambienti mobile. > **Modifiche Chiave in Apollo Client 4.0** > > Apollo Client 4.0 disaccoppia gli export specifici di React in `@apollo/client/react`, supporta React 19 Suspense e il React Compiler, e sostituisce il monolitico `ApolloError` con classi di errore specifiche per un debugging migliore. ## Configurazione di Apollo Client 4 in React Native Il processo di installazione rimane semplice. Apollo Client 4.0 funziona sia con progetti Expo che con progetti React Native puri. ```bash # Installation npm install @apollo/client graphql ``` L'inizializzazione del client richiede un `HttpLink` per le richieste di rete e un `InMemoryCache` per la gestione dello stato locale. ```typescript // src/apollo/client.ts import { ApolloClient, InMemoryCache, HttpLink } from '@apollo/client'; const httpLink = new HttpLink({ uri: 'https://api.example.com/graphql', // Enable text streaming for @defer and subscriptions fetchOptions: { reactNative: { textStreaming: true }, }, }); export const apolloClient = new ApolloClient({ link: httpLink, cache: new InMemoryCache({ typePolicies: { Query: { fields: { // Merge paginated results products: { keyArgs: ['category'], merge(existing = [], incoming) { return [...existing, ...incoming]; }, }, }, }, }, }), }); ``` La configurazione `typePolicies` gestisce la normalizzazione della cache per i dati paginati, un requisito comune nelle app mobile con scroll infinito. ## Avvolgere l'App con ApolloProvider Il pattern del provider connette Apollo Client all'albero dei componenti React. Deve essere posizionato al livello root, tipicamente in `App.tsx` o nel layout di Expo Router. ```tsx // App.tsx import { ApolloProvider } from '@apollo/client/react'; import { apolloClient } from './src/apollo/client'; import { RootNavigator } from './src/navigation'; export default function App() { return ( ); } ``` Apollo Client 4.0 importa gli hook React da `@apollo/client/react` invece che dal punto di ingresso principale. Questa modifica riduce la dimensione del bundle quando il core client viene eseguito in contesti non-React. ## Scrivere Query GraphQL Type-Safe GraphQL Code Generator produce tipi TypeScript dallo schema, eliminando le discrepanze di tipo a runtime. L'installazione avviene insieme al plugin client. ```bash # Install codegen tools npm install -D @graphql-codegen/cli @graphql-codegen/client-preset ``` La configurazione di codegen punta allo schema e specifica le posizioni di output. ```typescript // codegen.ts import type { CodegenConfig } from '@graphql-codegen/cli'; const config: CodegenConfig = { schema: 'https://api.example.com/graphql', documents: ['src/**/*.tsx', 'src/**/*.ts'], generates: { './src/gql/': { preset: 'client', config: { documentMode: 'string', }, }, }, }; export default config; ``` L'esecuzione di `npx graphql-codegen` genera nodi documento tipizzati che l'hook `useQuery` consuma. ## Recupero Dati con useQuery L'hook `useQuery` gestisce gli stati di caricamento, gli errori e gli aggiornamenti della cache. Apollo Client 4.0 introduce l'API `dataState` per transizioni di stato più prevedibili. ```tsx // src/screens/ProductListScreen.tsx import { useQuery } from '@apollo/client/react'; import { graphql } from '../gql'; import { ActivityIndicator, FlatList, Text, View } from 'react-native'; const GET_PRODUCTS = graphql(` query GetProducts($category: String!, $limit: Int, $offset: Int) { products(category: $category, limit: $limit, offset: $offset) { id name price imageUrl } } `); export function ProductListScreen({ category }: { category: string }) { const { data, loading, error, fetchMore } = useQuery(GET_PRODUCTS, { variables: { category, limit: 20, offset: 0 }, // Fetch from cache first, then network fetchPolicy: 'cache-and-network', // Keep previous data while fetching new notifyOnNetworkStatusChange: true, }); if (error) { return Errore: {error.message}; } const loadMore = () => { fetchMore({ variables: { offset: data?.products.length ?? 0 }, }); }; return ( item.id} renderItem={({ item }) => } onEndReached={loadMore} onEndReachedThreshold={0.5} ListFooterComponent={loading ? : null} /> ); } ``` La fetch policy `cache-and-network` visualizza immediatamente i dati in cache mentre aggiorna dal server in background. Questo pattern riduce la latenza percepita sulle reti mobili. ## Mutation e Aggiornamenti Ottimistici Le mutation modificano i dati del server e aggiornano la cache locale. Le risposte ottimistiche forniscono feedback immediato prima che il server confermi la modifica. ```tsx // src/hooks/useAddToCart.ts import { useMutation } from '@apollo/client/react'; import { graphql } from '../gql'; const ADD_TO_CART = graphql(` mutation AddToCart($productId: ID!, $quantity: Int!) { addToCart(productId: $productId, quantity: $quantity) { id items { id product { id name } quantity } totalPrice } } `); export function useAddToCart() { const [addToCart, { loading }] = useMutation(ADD_TO_CART, { // Optimistic response for instant UI feedback optimisticResponse: ({ productId, quantity }) => ({ addToCart: { __typename: 'Cart', id: 'current-cart', items: [], totalPrice: 0, }, }), // Update cache after mutation update(cache, { data }) { if (!data?.addToCart) return; cache.modify({ id: cache.identify({ __typename: 'Cart', id: 'current-cart' }), fields: { items: () => data.addToCart.items, totalPrice: () => data.addToCart.totalPrice, }, }); }, }); return { addToCart, loading }; } ``` Il metodo `cache.modify` aggiorna direttamente i campi in cache senza rifare il fetch dell'intera query. Questo approccio minimizza le richieste di rete sulle connessioni cellulari. ## Gestione degli Errori di Rete nelle App Mobile Apollo Client 4.0 sostituisce il generico `ApolloError` con classi di errore specifiche. I metodi statici `.is()` permettono una gestione degli errori type-safe. ```tsx // src/components/ErrorBoundary.tsx import { NetworkError, GraphQLErrors } from '@apollo/client/errors'; import { Text, Button, View } from 'react-native'; interface Props { error: Error; onRetry: () => void; } export function QueryErrorHandler({ error, onRetry }: Props) { // Network failure (offline, timeout, DNS) if (NetworkError.is(error)) { return ( Connessione fallita. Controlla la tua connessione internet.