Flutter天气数据获取插件weatherapi的使用

发布于 1周前 作者 gougou168 来自 Flutter

Flutter天气数据获取插件weatherapi的使用

1. 简介

weatherapi 是一个用于从 WeatherAPI.com 获取天气信息的Flutter插件。你可以通过提供地理坐标或城市名称来获取天气数据。

2. 安装 (Flutter)

要将 weatherapi 添加到你的 Flutter 项目中,请按照以下步骤操作:

  1. 打开项目的 pubspec.yaml 文件。
  2. 在文件中找到 dependencies 部分。
  3. weatherapi 作为依赖项添加,并指定版本(可选)。
dependencies:
  flutter:
    sdk: flutter
  weatherapi: ^1.1.0
  1. 保存 pubspec.yaml 文件。
  2. 在终端中运行 flutter pub get 或使用 IDE 中的相关选项来获取新依赖项。

3. 权限

该插件本身不需要任何权限。但是,如果你打算获取设备的地理位置,建议使用 geolocator 插件。

4. 使用方法

4.1 获取 API 密钥

首先,你需要从 WeatherAPI.com 获取一个免费的 API 密钥。然后,导入库并创建一个 WeatherRequest 实例。

import 'package:weatherapi/weatherapi.dart';

// 创建 WeatherRequest 实例,默认语言为英语
WeatherRequest wr = WeatherRequest('YOUR_API_KEY');

// 指定语言(例如意大利语)
WeatherRequest wr = WeatherRequest('YOUR_API_KEY', language: Language.italian);

4.2 实时天气 API (current weather)

通过城市名称获取实时天气
String cityName = 'Parma';

RealtimeWeather rw = await wr.getRealtimeWeatherByCityName(cityName);
print('Condition: ${rw.current.condition.text}');
通过经纬度获取实时天气
double latitude = 44.8;
double longitude = 10.33;

RealtimeWeather rw = await wr.getRealtimeWeatherByLocation(latitude, longitude);
print('Condition: ${rw.current.condition.text}');

4.3 天气预报 API (forecast weather)

通过城市名称获取天气预报
String cityName = 'Parma';

ForecastWeather fw = await wr.getForecastWeatherByCityName(cityName);
print('Tomorrow sunrise: ${fw.forecast[1].astro.sunrise}');
通过经纬度获取天气预报
double latitude = 44.8;
double longitude = 10.33;

ForecastWeather fw = await wr.getForecastWeatherByLocation(latitude, longitude);
print('Tomorrow sunrise: ${fw.forecast[1].astro.sunrise}');

4.4 搜索/自动补全 API (search/autocomplete)

通过城市名称获取位置结果
String cityName = 'Parma';

SearchResults sr = await wr.getResultsByCityName(cityName);
print('First result: ${sr.locations[0].name}');
通过经纬度获取位置结果
double latitude = 44.8;
double longitude = 10.33;

SearchResults sr = await wr.getResultsByLocation(latitude, longitude);
print('First result: ${sr.locations[0].name}');

5. 异常处理

在以下情况下会抛出异常:

  • 提供的 WeatherAPI.com 密钥无效。
  • API 返回了错误响应。

6. 支持的语言

weatherapi 支持多种语言,包括但不限于:

  • 简体中文 (chineseSimplified)
  • 英语 (默认)
  • 意大利语 (italian)
  • 法语 (french)
  • 德语 (german)
  • 日语 (japanese)
  • 西班牙语 (spanish)
  • 俄语 (russian)
  • 韩语 (korean)
  • 印地语 (hindi)
  • 阿拉伯语 (arabic)
  • 葡萄牙语 (portuguese)
  • 更多语言请参考官方文档。

7. 完整示例 Demo

以下是一个完整的 Flutter 示例应用程序,展示了如何使用 weatherapi 插件获取实时天气和天气预报数据。

import 'package:flutter/material.dart';
import 'package:weatherapi/weatherapi.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Weather App',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: WeatherScreen(),
    );
  }
}

class WeatherScreen extends StatefulWidget {
  [@override](/user/override)
  _WeatherScreenState createState() => _WeatherScreenState();
}

class _WeatherScreenState extends State<WeatherScreen> {
  final WeatherRequest _weatherRequest = WeatherRequest('YOUR_API_KEY');
  String _cityName = 'Parma';
  RealtimeWeather? _realtimeWeather;
  ForecastWeather? _forecastWeather;

  [@override](/user/override)
  void initState() {
    super.initState();
    _fetchWeatherData();
  }

  Future<void> _fetchWeatherData() async {
    try {
      // 获取实时天气
      RealtimeWeather realtimeWeather = await _weatherRequest.getRealtimeWeatherByCityName(_cityName);
      setState(() {
        _realtimeWeather = realtimeWeather;
      });

      // 获取天气预报
      ForecastWeather forecastWeather = await _weatherRequest.getForecastWeatherByCityName(_cityName);
      setState(() {
        _forecastWeather = forecastWeather;
      });
    } catch (e) {
      print('Error fetching weather data: $e');
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Weather App'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text(
              '实时天气:',
              style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
            ),
            SizedBox(height: 8),
            if (_realtimeWeather != null)
              Text(
                '当前天气状况: ${_realtimeWeather!.current.condition.text}',
                style: TextStyle(fontSize: 16),
              ),
            SizedBox(height: 16),
            Text(
              '天气预报:',
              style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
            ),
            SizedBox(height: 8),
            if (_forecastWeather != null)
              Text(
                '明天日出时间: ${_forecastWeather!.forecast[1].astro.sunrise}',
                style: TextStyle(fontSize: 16),
              ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter天气数据获取插件weatherapi的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter天气数据获取插件weatherapi的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用weatherapi插件来获取天气数据的示例代码。我们假设你已经有一个Flutter项目,并且已经安装了必要的依赖项。

首先,你需要在pubspec.yaml文件中添加http依赖项(虽然weatherapi本身可能不是一个具体的Flutter插件,但通常你需要HTTP请求来获取天气数据):

dependencies:
  flutter:
    sdk: flutter
  http: ^0.13.3  # 确保版本是最新的,或者根据需要选择版本

然后运行flutter pub get来安装依赖项。

接下来,我们编写一个Dart文件来处理天气数据的获取。假设我们使用weatherapi.com提供的API。

weather_service.dart

import 'dart:convert';
import 'package:http/http.dart' as http;

class WeatherService {
  final String apiKey = 'YOUR_API_KEY'; // 替换为你的weatherapi.com API密钥
  final String baseUrl = 'http://api.weatherapi.com/v1';

  Future<Map<String, dynamic>> getWeatherData(String city) async {
    String url = '$baseUrl/current.json?key=$apiKey&q=$city';
    
    try {
      http.Response response = await http.get(Uri.parse(url));
      
      if (response.statusCode == 200) {
        Map<String, dynamic> data = jsonDecode(response.body);
        return data;
      } else {
        throw Exception('Failed to load weather data');
      }
    } catch (e) {
      throw Exception(e);
    }
  }
}

main.dart

import 'package:flutter/material.dart';
import 'weather_service.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Weather App',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: WeatherScreen(),
    );
  }
}

class WeatherScreen extends StatefulWidget {
  @override
  _WeatherScreenState createState() => _WeatherScreenState();
}

class _WeatherScreenState extends State<WeatherScreen> {
  String _city = 'London';
  String _weatherData = '';
  WeatherService _weatherService = WeatherService();

  void _getWeather() async {
    try {
      Map<String, dynamic> weather = await _weatherService.getWeatherData(_city);
      setState(() {
        _weatherData = '${weather['current']['temp_c']}°C, ${weather['current']['condition']['text']}';
      });
    } catch (e) {
      setState(() {
        _weatherData = 'Error: ${e.toString()}';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Weather App'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            TextField(
              decoration: InputDecoration(
                border: OutlineInputBorder(),
                labelText: 'Enter City',
              ),
              onChanged: (value) {
                setState(() {
                  _city = value;
                });
              },
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _getWeather,
              child: Text('Get Weather'),
            ),
            SizedBox(height: 20),
            Text(
              _weatherData,
              style: TextStyle(fontSize: 24),
            ),
          ],
        ),
      ),
    );
  }
}

解释

  1. weather_service.dart:

    • WeatherService类负责与weatherapi.com进行通信。
    • getWeatherData方法接收一个城市名称,构造API请求URL,发送HTTP GET请求,并返回JSON响应数据。
  2. main.dart:

    • MyAppWeatherScreen是Flutter应用的根组件和主屏幕组件。
    • WeatherScreen是一个有状态的组件,包含一个文本字段用于输入城市名称,一个按钮用于触发天气数据获取,以及一个文本组件用于显示天气数据。

确保替换YOUR_API_KEY为你的实际weatherapi.com API密钥。运行应用,输入城市名称并点击“Get Weather”按钮,你应该能够看到该城市的当前温度和天气状况。

回到顶部