Introducció
En aquest tema, aprendrem a utilitzar AsyncStorage
per emmagatzemar dades locals en una aplicació React Native. AsyncStorage
és una API asíncrona, no xifrada i persistent que permet emmagatzemar dades en format clau-valor. És útil per guardar configuracions, preferències d'usuari o qualsevol altra informació que necessiti ser persistent entre sessions.
Objectius
- Comprendre què és
AsyncStorage
i per a què serveix. - Aprendre a utilitzar les funcions bàsiques de
AsyncStorage
per guardar, recuperar i eliminar dades. - Implementar exemples pràctics per reforçar els conceptes apresos.
Instal·lació
Per utilitzar AsyncStorage
, primer hem d'instal·lar el paquet corresponent. Pots fer-ho amb npm o yarn:
o
Després d'instal·lar el paquet, assegura't de vincular-lo correctament si estàs utilitzant una versió de React Native anterior a 0.60:
Funcions Bàsiques
Guardar Dades
Per guardar dades, utilitzem la funció setItem
. Aquesta funció accepta una clau i un valor, ambdós en format de cadena de text.
import AsyncStorage from '@react-native-async-storage/async-storage'; const storeData = async (key, value) => { try { await AsyncStorage.setItem(key, value); console.log('Dades guardades correctament'); } catch (e) { console.error('Error guardant les dades', e); } };
Recuperar Dades
Per recuperar dades, utilitzem la funció getItem
. Aquesta funció accepta una clau i retorna el valor associat a aquesta clau.
const getData = async (key) => { try { const value = await AsyncStorage.getItem(key); if (value !== null) { console.log('Dades recuperades:', value); return value; } } catch (e) { console.error('Error recuperant les dades', e); } };
Eliminar Dades
Per eliminar dades, utilitzem la funció removeItem
. Aquesta funció accepta una clau i elimina el valor associat a aquesta clau.
const removeData = async (key) => { try { await AsyncStorage.removeItem(key); console.log('Dades eliminades correctament'); } catch (e) { console.error('Error eliminant les dades', e); } };
Exemple Pràctic
A continuació, implementarem un exemple pràctic que utilitza AsyncStorage
per guardar, recuperar i eliminar el nom d'un usuari.
import React, { useState } from 'react'; import { View, Text, TextInput, Button } from 'react-native'; import AsyncStorage from '@react-native-async-storage/async-storage'; const App = () => { const [name, setName] = useState(''); const [storedName, setStoredName] = useState(''); const saveName = async () => { await storeData('user_name', name); setName(''); }; const loadName = async () => { const name = await getData('user_name'); setStoredName(name); }; const deleteName = async () => { await removeData('user_name'); setStoredName(''); }; return ( <View style={{ padding: 20 }}> <TextInput placeholder="Escriu el teu nom" value={name} onChangeText={setName} style={{ borderBottomWidth: 1, marginBottom: 20 }} /> <Button title="Guardar Nom" onPress={saveName} /> <Button title="Carregar Nom" onPress={loadName} /> <Button title="Eliminar Nom" onPress={deleteName} /> {storedName ? <Text>Nom guardat: {storedName}</Text> : null} </View> ); }; export default App;
Exercicis Pràctics
Exercici 1: Guardar i Recuperar Preferències d'Usuari
- Crea una aplicació que permeti a l'usuari guardar les seves preferències de tema (clar o fosc) utilitzant
AsyncStorage
. - Implementa una funció per recuperar aquestes preferències quan l'aplicació es carrega.
Exercici 2: Llista de Tasques
- Crea una aplicació de llista de tasques on les tasques es guardin localment utilitzant
AsyncStorage
. - Implementa funcions per afegir, eliminar i marcar tasques com a completades.
Solucions
Solució Exercici 1
import React, { useState, useEffect } from 'react'; import { View, Text, Button } from 'react-native'; import AsyncStorage from '@react-native-async-storage/async-storage'; const App = () => { const [theme, setTheme] = useState('light'); useEffect(() => { const loadTheme = async () => { const savedTheme = await getData('app_theme'); if (savedTheme) { setTheme(savedTheme); } }; loadTheme(); }, []); const toggleTheme = async () => { const newTheme = theme === 'light' ? 'dark' : 'light'; setTheme(newTheme); await storeData('app_theme', newTheme); }; return ( <View style={{ padding: 20, backgroundColor: theme === 'light' ? '#fff' : '#333', flex: 1 }}> <Text style={{ color: theme === 'light' ? '#000' : '#fff' }}>Tema actual: {theme}</Text> <Button title="Canviar Tema" onPress={toggleTheme} /> </View> ); }; export default App;
Solució Exercici 2
import React, { useState, useEffect } from 'react'; import { View, Text, TextInput, Button, FlatList, TouchableOpacity } from 'react-native'; import AsyncStorage from '@react-native-async-storage/async-storage'; const App = () => { const [task, setTask] = useState(''); const [tasks, setTasks] = useState([]); useEffect(() => { const loadTasks = async () => { const savedTasks = await getData('tasks'); if (savedTasks) { setTasks(JSON.parse(savedTasks)); } }; loadTasks(); }, []); const addTask = async () => { const newTasks = [...tasks, { id: Date.now().toString(), text: task, completed: false }]; setTasks(newTasks); await storeData('tasks', JSON.stringify(newTasks)); setTask(''); }; const toggleTaskCompletion = async (id) => { const newTasks = tasks.map(task => task.id === id ? { ...task, completed: !task.completed } : task); setTasks(newTasks); await storeData('tasks', JSON.stringify(newTasks)); }; const deleteTask = async (id) => { const newTasks = tasks.filter(task => task.id !== id); setTasks(newTasks); await storeData('tasks', JSON.stringify(newTasks)); }; return ( <View style={{ padding: 20 }}> <TextInput placeholder="Escriu una tasca" value={task} onChangeText={setTask} style={{ borderBottomWidth: 1, marginBottom: 20 }} /> <Button title="Afegir Tasca" onPress={addTask} /> <FlatList data={tasks} keyExtractor={item => item.id} renderItem={({ item }) => ( <View style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', marginBottom: 10 }}> <TouchableOpacity onPress={() => toggleTaskCompletion(item.id)}> <Text style={{ textDecorationLine: item.completed ? 'line-through' : 'none' }}>{item.text}</Text> </TouchableOpacity> <Button title="Eliminar" onPress={() => deleteTask(item.id)} /> </View> )} /> </View> ); }; export default App;
Conclusió
En aquest tema, hem après a utilitzar AsyncStorage
per emmagatzemar dades locals en una aplicació React Native. Hem vist com guardar, recuperar i eliminar dades, i hem implementat exemples pràctics per reforçar els conceptes apresos. AsyncStorage
és una eina poderosa per gestionar dades locals i pot ser molt útil en diverses situacions dins d'una aplicació mòbil.
Curs de React Native
Mòdul 1: Introducció a React Native
- Què és React Native?
- Configuració de l'entorn de desenvolupament
- Aplicació Hello World
- Comprendre JSX
- Components i Props
Mòdul 2: Components bàsics i estilització
- Visió general dels components bàsics
- Text, View i Image
- Estilització amb Flexbox
- Gestió de l'entrada de l'usuari
- ScrollView i ListView
Mòdul 3: Estat i cicle de vida
- Mètodes d'estat i cicle de vida
- Gestió d'esdeveniments
- Renderització condicional
- Llistes i claus
- Formularis i components controlats
Mòdul 4: Navegació
- Introducció a React Navigation
- Stack Navigator
- Tab Navigator
- Drawer Navigator
- Passar paràmetres a les rutes
Mòdul 5: Xarxes i dades
- Obtenir dades amb Fetch API
- Utilitzar Axios per a sol·licituds HTTP
- Gestió d'errors de xarxa
- AsyncStorage per a dades locals
- Integració amb APIs REST
Mòdul 6: Conceptes avançats
Mòdul 7: Desplegament i publicació
- Construcció per a iOS
- Construcció per a Android
- Publicació a l'App Store
- Publicació a Google Play
- Integració i lliurament continus