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,
);
}
}
注意:
- 替换
YOUR_API_KEY
为你从WAQI官网获取的API Key。 - 上述代码中的
AirQualityData
、Location
、Iaqi
和IaqiValue
类是为了方便解析API返回的数据结构。实际的JSON结构可能会有所不同,你可能需要根据实际的API响应调整这些类的定义。 - 由于API可能会返回多种污染物数据,示例中只解析了
o3
(臭氧)的数据作为示例。你可能需要添加对其他污染物的处理。
这个示例应用允许用户输入城市名称,然后点击按钮查询该城市的空气质量数据,并在界面上显示结果。