En aquest projecte, construirem una aplicació del temps utilitzant React Native. Aquesta aplicació permetrà als usuaris veure la informació meteorològica actual per a una ubicació específica. Aprendrem a obtenir dades d'una API externa, gestionar l'estat de l'aplicació i mostrar la informació de manera atractiva.
Objectius del projecte
- Obtenir dades meteorològiques d'una API externa.
- Gestionar l'estat de l'aplicació amb Hooks.
- Mostrar dades meteorològiques de manera clara i atractiva.
- Implementar una interfície d'usuari responsiva.
Requisits previs
- Coneixements bàsics de React Native.
- Familiaritat amb l'ús de Fetch API o Axios per a sol·licituds HTTP.
- Comprensió bàsica de l'estat i els efectes en React (useState, useEffect).
Passos del projecte
- Configuració inicial del projecte
Comencem creant un nou projecte de React Native.
- Instal·lació de dependències necessàries
Instal·larem Axios per gestionar les sol·licituds HTTP.
- Obtenir una API Key
Registra't a un servei d'API meteorològica com OpenWeatherMap i obté una API Key.
- Estructura del projecte
Organitzarem el projecte de la següent manera:
WeatherApp/ ├── App.js ├── components/ │ ├── WeatherInfo.js │ ├── WeatherForm.js ├── utils/ │ └── api.js
- Crear el component WeatherForm
Aquest component permetrà als usuaris introduir una ubicació per obtenir la informació meteorològica.
// components/WeatherForm.js
import React, { useState } from 'react';
import { View, TextInput, Button, StyleSheet } from 'react-native';
const WeatherForm = ({ onSubmit }) => {
const [location, setLocation] = useState('');
const handleSubmit = () => {
onSubmit(location);
};
return (
<View style={styles.container}>
<TextInput
style={styles.input}
placeholder="Enter location"
value={location}
onChangeText={setLocation}
/>
<Button title="Get Weather" onPress={handleSubmit} />
</View>
);
};
const styles = StyleSheet.create({
container: {
margin: 20,
},
input: {
height: 40,
borderColor: 'gray',
borderWidth: 1,
marginBottom: 10,
paddingHorizontal: 10,
},
});
export default WeatherForm;
- Crear el component WeatherInfo
Aquest component mostrarà la informació meteorològica.
// components/WeatherInfo.js
import React from 'react';
import { View, Text, StyleSheet } from 'react-native';
const WeatherInfo = ({ weather }) => {
if (!weather) return null;
return (
<View style={styles.container}>
<Text style={styles.title}>{weather.name}</Text>
<Text style={styles.temp}>{weather.main.temp}°C</Text>
<Text style={styles.description}>{weather.weather[0].description}</Text>
</View>
);
};
const styles = StyleSheet.create({
container: {
alignItems: 'center',
margin: 20,
},
title: {
fontSize: 24,
fontWeight: 'bold',
},
temp: {
fontSize: 48,
fontWeight: 'bold',
},
description: {
fontSize: 18,
fontStyle: 'italic',
},
});
export default WeatherInfo;
- Crear la funció d'obtenció de dades
Crearem una funció per obtenir les dades meteorològiques des de l'API.
// utils/api.js
import axios from 'axios';
const API_KEY = 'YOUR_API_KEY';
const BASE_URL = 'https://api.openweathermap.org/data/2.5/weather';
export const fetchWeather = async (location) => {
try {
const response = await axios.get(BASE_URL, {
params: {
q: location,
units: 'metric',
appid: API_KEY,
},
});
return response.data;
} catch (error) {
console.error(error);
throw error;
}
};
- Integrar tot a App.js
Finalment, integrem tots els components i la funció d'obtenció de dades a l'arxiu principal de l'aplicació.
// App.js
import React, { useState } from 'react';
import { SafeAreaView, StyleSheet, Text } from 'react-native';
import WeatherForm from './components/WeatherForm';
import WeatherInfo from './components/WeatherInfo';
import { fetchWeather } from './utils/api';
const App = () => {
const [weather, setWeather] = useState(null);
const [error, setError] = useState(null);
const handleFetchWeather = async (location) => {
try {
const data = await fetchWeather(location);
setWeather(data);
setError(null);
} catch (err) {
setError('Could not fetch weather data');
setWeather(null);
}
};
return (
<SafeAreaView style={styles.container}>
<WeatherForm onSubmit={handleFetchWeather} />
{error && <Text style={styles.error}>{error}</Text>}
<WeatherInfo weather={weather} />
</SafeAreaView>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
padding: 20,
},
error: {
color: 'red',
textAlign: 'center',
},
});
export default App;
- Provar l'aplicació
Executa l'aplicació per assegurar-te que tot funciona correctament.
Exercicis pràctics
- Afegir més informació meteorològica: Extén l'aplicació per mostrar més dades com la humitat, la velocitat del vent, etc.
- Estilització avançada: Millora l'estilització de l'aplicació per fer-la més atractiva.
- Gestió d'errors: Implementa una millor gestió d'errors per mostrar missatges d'error més detallats als usuaris.
Conclusió
En aquest projecte, hem creat una aplicació del temps utilitzant React Native. Hem après a obtenir dades d'una API externa, gestionar l'estat de l'aplicació i mostrar la informació de manera atractiva. Aquest projecte ens ha proporcionat una bona base per a desenvolupar aplicacions més complexes en el futur.
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
