Flutter空气质量查询插件air_quality_waqi的使用

Flutter空气质量查询插件air_quality_waqi的使用

收集来自世界空气质量指数服务的数据。

权限

无需任何权限。

使用方法

导入

location 包也是 AirQualityWaqi 包所需的。

import 'package:air_quality_waqi/air_quality_waqi.dart';
初始化

需要一个API密钥才能进行查询。API密钥可以通过以下链接获得:https://aqicn.org/api/

示例:

String key = '9e538456b2b85c92647d8b65090e29f957638c77';
AirQualityWaqi airQualityWaqi = new AirQualityWaqi(key);
空气质量数据示例
/// 通过城市名称(慕尼黑)
AirQualityWaqiData feedFromCity = 
    await airQualityWaqi.feedFromCity('munich');

/// 通过站点ID(哥德堡气象站)
AirQualityWaqiData feedFromStationId = 
    await airQualityWaqi.feedFromStationId('7867');

/// 通过地理坐标(柏林)
AirQualityWaqiData feedFromGeoLocation = 
    await airQualityWaqi.feedFromGeoLocation('52.6794', '12.5346');

/// 通过IP地址(取决于服务提供商)
AirQualityWaqiData fromIP = 
    await airQualityWaqi.feedFromIP();

许可证

该插件在MIT许可证下授权。


完整示例代码

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

// 枚举状态
enum AppState { NOT_DOWNLOADED, DOWNLOADING, FINISHED_DOWNLOADING }

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // 应用程序的根组件
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: '空气质量示例',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, this.title}) : super(key: key);

  final String? title;

  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String _key = '9e538456b2b85c92647d8b65090e29f957638c77';
  late AirQualityWaqi _airQuality;
  AppState _state = AppState.NOT_DOWNLOADED;
  late List<AirQualityWaqiData> _data;

  [@override](/user/override)
  void initState() {
    super.initState();
    _airQuality = new AirQualityWaqi(_key);
  }

  Future<void> download() async {
    _data = [];

    setState(() {
      _state = AppState.DOWNLOADING;
    });

    // 获取慕尼黑的城市空气质量数据
    AirQualityWaqiData feedFromCity = await _airQuality.feedFromCity('munich');

    // 获取哥德堡气象站的空气质量数据
    AirQualityWaqiData feedFromStationId = await _airQuality.feedFromStationId('7867');

    // 获取柏林的地理位置空气质量数据
    AirQualityWaqiData feedFromGeoLocation = await _airQuality.feedFromGeoLocation('52.6794', '12.5346');

    // 获取通过IP地址获取的空气质量数据
    AirQualityWaqiData fromIP = await _airQuality.feedFromIP();

    // 更新屏幕状态
    setState(() {
      _data.add(feedFromCity);
      _data.add(feedFromStationId);
      _data.add(feedFromGeoLocation);
      _data.add(fromIP);
    });

    setState(() {
      _state = AppState.FINISHED_DOWNLOADING;
    });
  }

  Widget contentFinishedDownload() {
    return Center(
      child: ListView.separated(
        itemCount: _data.length,
        itemBuilder: (context, index) {
          return ListTile(
            title: Text(_data[index].toString()),
          );
        },
        separatorBuilder: (context, index) {
          return Divider();
        },
      ),
    );
  }

  Widget contentDownloading() {
    return Container(
        margin: EdgeInsets.all(25),
        child: Column(children: [
          Text(
            '正在获取空气质量数据...',
            style: TextStyle(fontSize: 20),
          ),
          Container(
              margin: EdgeInsets.only(top: 50),
              child: Center(child: CircularProgressIndicator(strokeWidth: 10)))
        ]));
  }

  Widget contentNotDownloaded() {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Text(
            '点击按钮下载空气质量数据',
          ),
        ],
      ),
    );
  }

  Widget showContent() => _state == AppState.FINISHED_DOWNLOADING
      ? contentFinishedDownload()
      : _state == AppState.DOWNLOADING
          ? contentDownloading()
          : contentNotDownloaded();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title!),
      ),
      body: showContent(),
      floatingActionButton: FloatingActionButton(
        onPressed: download,
        tooltip: '下载',
        child: Icon(Icons.cloud_download),
      ),
    );
  }
}

更多关于Flutter空气质量查询插件air_quality_waqi的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter空气质量查询插件air_quality_waqi的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用Flutter中的air_quality_waqi插件来查询空气质量的示例代码。这个插件允许你访问World Air Quality Index (WAQI) API,获取实时空气质量数据。

首先,确保你的Flutter项目中已经添加了air_quality_waqi依赖。在pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  air_quality_waqi: ^x.y.z  # 替换为最新版本号

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

接下来,我们编写一个示例Flutter应用,展示如何使用这个插件来查询某个城市的空气质量。

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

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

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

class AirQualityScreen extends StatefulWidget {
  @override
  _AirQualityScreenState createState() => _AirQualityScreenState();
}

class _AirQualityScreenState extends State<AirQualityScreen> {
  String? cityName;
  AirQualityData? airQualityData;
  String? errorMessage;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Air Quality Checker'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            TextField(
              decoration: InputDecoration(
                labelText: 'Enter city name',
              ),
              onChanged: (value) {
                setState(() {
                  cityName = value;
                });
              },
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: fetchAirQualityData,
              child: Text('Get Air Quality'),
            ),
            SizedBox(height: 16),
            if (errorMessage != null)
              Text(
                errorMessage!,
                style: TextStyle(color: Colors.red),
              ),
            if (airQualityData != null)
              Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: <Widget>[
                  Text('AQI: ${airQualityData!.aqi!.toInt()}'),
                  Text('City: ${airQualityData!.location!.city}'),
                  Text('Country: ${airQualityData!.location!.country}'),
                  Text('Pollutants: ${airQualityData!.iaqi!.values.map((e) => '${e.pollutant}: ${e.value.toInt()}').join(', ')}'),
                ],
              ),
          ],
        ),
      ),
    );
  }

  Future<void> fetchAirQualityData() async {
    if (cityName == null || cityName!.isEmpty) {
      setState(() {
        errorMessage = 'Please enter a city name';
        airQualityData = null;
      });
      return;
    }

    try {
      final AirQualityWaqi airQualityWaqi = AirQualityWaqi(apiKey: 'YOUR_API_KEY'); // 替换为你的API Key
      final AirQualityResponse response = await airQualityWaqi.getAirQualityByCityName(cityName!);
      setState(() {
        errorMessage = null;
        airQualityData = response.data;
      });
    } catch (e) {
      setState(() {
        errorMessage = 'Failed to fetch air quality data: ${e.toString()}';
        airQualityData = null;
      });
    }
  }
}

class AirQualityData {
  final int? aqi;
  final Location? location;
  final Iaqi? iaqi;

  AirQualityData({this.aqi, this.location, this.iaqi});

  factory AirQualityData.fromJson(Map<String, dynamic> json) {
    return AirQualityData(
      aqi: json['aqi'] as int?,
      location: json['location'] != null ? Location.fromJson(json['location'] as Map<String, dynamic>) : null,
      iaqi: json['iaqi'] != null ? Iaqi.fromJson(json['iaqi'] as Map<String, dynamic>) : null,
    );
  }
}

class Location {
  final String? city;
  final String? country;

  Location({this.city, this.country});

  factory Location.fromJson(Map<String, dynamic> json) {
    return Location(
      city: json['name'] as String?,
      country: json['country'] as String?,
    );
  }
}

class Iaqi {
  final List<IaqiValue> values;

  Iaqi({required this.values});

  factory Iaqi.fromJson(Map<String, dynamic> json) {
    List<IaqiValue> values = [];
    json['o3']?.forEach((key, value) {
      values.add(IaqiValue(pollutant: key, value: value as num));
    });
    // 根据实际返回的JSON结构,可能需要添加对其他污染物的处理
    return Iaqi(values: values);
  }
}

class IaqiValue {
  final String pollutant;
  final num value;

  IaqiValue({required this.pollutant, required this.value});
}

class AirQualityResponse {
  final AirQualityData? data;

  AirQualityResponse({this.data});

  factory AirQualityResponse.fromJson(Map<String, dynamic> json) {
    return AirQualityResponse(
      data: json['data'] != null ? AirQualityData.fromJson(json['data'] as Map<String, dynamic>) : null,
    );
  }
}

注意

  1. 替换YOUR_API_KEY为你从WAQI官网获取的API Key。
  2. 上述代码中的AirQualityDataLocationIaqiIaqiValue类是为了方便解析API返回的数据结构。实际的JSON结构可能会有所不同,你可能需要根据实际的API响应调整这些类的定义。
  3. 由于API可能会返回多种污染物数据,示例中只解析了o3(臭氧)的数据作为示例。你可能需要添加对其他污染物的处理。

这个示例应用允许用户输入城市名称,然后点击按钮查询该城市的空气质量数据,并在界面上显示结果。

回到顶部