Criar um aplicativo Weather no Flutter

Tempo de leitura: 2 minutes

Neste tutorial, aprendemos a criar um aplicativo de clima usando o Flutter. Usamos a API OpenWeatherMap para obter dados meteorológicos de um local específico e exibimos a descrição do clima na tela.

Começamos criando um novo projeto do Flutter e adicionando as dependências necessárias. Em seguida, criamos um novo widget Weather e uma classe _WeatherState que estende o State.

Dentro da classe _WeatherState, criamos um método Future getWeather que faz uma solicitação HTTP à API OpenWeatherMap para recuperar dados meteorológicos de um local específico. Usamos o método jsonDecode para analisar os dados JSON retornados pela API.

Em seguida, adicionamos um widget Column ao método build do widget Weather que contém um widget Text para exibir a descrição do clima.

Por fim, adicionamos um widget TextField e um widget ElevatedButton para permitir que o usuário insira o nome de uma cidade e acione o método getWeather quando pressionado, passando o nome da cidade inserido pelo usuário como argumento.

Este tutorial fornece um exemplo básico de como criar um aplicativo de clima usando o Flutter, mas há muitos recursos adicionais que você pode acrescentar, como exibir informações adicionais sobre o clima ou adicionar serviços de localização para obter automaticamente a localização do usuário.

Primeiro, vamos modificar o método getWeather para retornar mais dados sobre o clima, como a temperatura e a umidade:

Future<dynamic> getWeather(String city) async {
  String apiKey = 'YOUR_API_KEY';
  String url =
      'https://api.openweathermap.org/data/2.5/weather?q=$city&appid=$apiKey&units=metric';
  http.Response response = await http.get(Uri.parse(url));
  if (response.statusCode == 200) {
    return jsonDecode(response.body);
  } else {
    throw Exception('Failed to load weather data');
  }
}

Agora que temos mais dados, vamos exibi-los na tela. Aqui está um método de compilação atualizado para o widget Weather:

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(
              "How is the weather in ...?",
              style: Theme.of(context).textTheme.titleLarge,
            ),
            const SizedBox(height: 20.0),
            Padding(
              padding: const EdgeInsets.symmetric(horizontal: 20.0),
              child: TextField(
                controller: _cityController,
                decoration: InputDecoration(
                  hintText: 'Enter city',
                  border: OutlineInputBorder(
                    borderSide: const BorderSide(
                      color: Colors.blue,
                    ),
                    borderRadius: BorderRadius.circular(14),
                  ),
                ),
              ),
            ),
            const SizedBox(height: 20.0),
            ElevatedButton(
              style: ElevatedButton.styleFrom(
                backgroundColor: Colors.blue,
                shape: RoundedRectangleBorder(
                  borderRadius: BorderRadius.circular(12),
                  side: BorderSide.none,
                ),
                padding:
                    const EdgeInsets.symmetric(horizontal: 35, vertical: 18),
                textStyle: const TextStyle(
                  fontSize: 20,
                  fontWeight: FontWeight.bold,
                ),
              ),
              onPressed: () {
                String city = _cityController.text;
                getWeather(city).then((weatherData) {
                  setState(() {
                    _weatherData = weatherData;
                    _icon = weatherData['weather'][0]['icon'];
                  });
                });
              },
              child: const Text(
                'Search',
                style: TextStyle(color: Colors.white),
              ),
            ),
            const SizedBox(height: 20.0),
            if (_weatherData != null)
              Column(
                children: [
                  Text(
                    'Temperature: ${_weatherData['main']['temp']}°C',
                    style: Theme.of(context).textTheme.titleLarge,
                  ),
                  const SizedBox(height: 10.0),
                  Image.network(
                    'https://openweathermap.org/img/w/$_icon.png',
                    width: 100,
                    height: 100,
                  ),
                  Text('Location: ${_weatherData['name']}'),
                  const SizedBox(height: 15.0),
                  Text('Country: ${_weatherData['sys']['country']}'),
                  const SizedBox(height: 15.0),
                  Text('Wind Speed: ${_weatherData['wind']['speed']}'),
                ],
              ),
          ],
        ),
      ),
    );
  }

 

Adicionamos dois widgets de Text para exibir a temperatura e a umidade. Também aumentamos o tamanho da fonte da descrição do clima para torná-la mais proeminente.

É isso aí! Agora você pode executar o aplicativo e ver as informações meteorológicas adicionais exibidas ao pesquisar uma cidade. Sinta-se à vontade para personalizar o layout e adicionar mais dados meteorológicos conforme desejar.