Flutter韩国天气查询插件korea_weather_api的使用

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

Flutter韩国天气查询插件korea_weather_api的使用

包说明

此插件用于方便地连接气象局的短期预报(旧称邻里预报)查询服务。

使用方法

公共数据门户认证密钥申请

请在以下网站登录或注册后进行申请:

公共数据门户气象局短期预报查询服务

请求

Weather 类用于获取超短期实况、超短期预报和短期预报。以下是 Weather 类的定义:

Weather({
  // 日期 [默认值: 当前日期时间]
  DateTime? dateTime, 
  
  // 预报点 X 坐标 [默认值: 37.5635694]
  double? nx, 
  
  // 预报点 Y 坐标 [默认值: 126.9800083]
  double? ny, 
  
  // 在公共数据门户获取的认证密钥
  required this.serviceKey, 
  
  // 页码 [默认值: 1]
  this.pageNo = 1, 
  
  // 每页结果数量 [默认值: 1000]
  this.numOfRows = 1000, 
  
  // 请求的数据格式(XML/JSON) [默认值: JSON]
  this.dataType = DataType.json, 
})

WeatherVersion 类用于获取预报版本:

WeatherVersion({
  // 日期 [默认值: 当前日期时间]
  DateTime? dateTime,
  
  // 在公共数据门户获取的认证密钥
  required this.serviceKey,
  
  // 页码 [默认值: 1]
  this.pageNo = 1,
  
  // 每页结果数量 [默认值: 1]
  this.numOfRows = 1,
  
  // 请求的数据格式(XML/JSON) [默认值: JSON]
  this.dataType = DataType.json,
  
  // 文件类型 [默认值: ODAM]
  this.fileType = FileType.oDAM,
})  

响应

  • SuperNct 表示超短期实况
  • SuperFct 表示超短期预报
  • Fct 表示短期预报
  • FctVersion 表示预报版本

接口

  • isLog:表示是否输出日志,默认为 true
  • customLogger:如果需要自定义日志输出,可以使用 pretty_dio_logger
  • getJSON:从 JSON 数据获取并返回模型
  • getItemJSON:从 JSON 数据获取并返回项
  • getItemListJSON:从 JSON 数据获取并返回项列表
  • getItemXML:从 XML 数据获取并返回项
  • getItemListXML:从 XML 数据获取并返回项列表

示例

主函数

main() 函数中添加 WeatherHttpOverrides()

import 'dart:io';
import 'package:korea_weather_api/korea_weather_api.dart';

void main() {
  HttpOverrides.global = WeatherHttpOverrides();
  runApp(const MyApp());
}

超短期实况示例

以下示例展示了如何使用 WeatherHttpOverrides() 获取超短期实况列表的 JSON 和 XML 数据:

Future<List<ItemSuperNct>> getSuperNctListJson({isLog = false}) async {
  final weather = Weather(
    serviceKey: 'your_service_key', // 替换为你的认证密钥
    pageNo: 1,
    numOfRows: 100,
  );
  final List<ItemSuperNct> items = [];
  final json = await SuperNctRepositoryImp(isLog: isLog).getItemListJSON(weather);

  json.map((e) => setState(() => items.add(e))).toList();

  return items;
}
Future<List<ItemSuperNct>> getSuperNctListXML({isLog = false}) async {
  final weather = Weather(
    serviceKey: 'your_service_key', // 替换为你的认证密钥
    pageNo: 1,
    numOfRows: 100,
  );
  final List<ItemSuperNct> items = [];
  final json = await SuperNctRepositoryImp(
    isLog: isLog,
  ).getItemListXML(weather);

  json.map((e) => setState(() => items.add(e))).toList();

  return items;
}

超短期预报示例

以下示例展示了如何获取超短期预报列表的 JSON 和 XML 数据:

Future<List<ItemSuperFct>> getSuperFctListJson({isLog = false}) async {
  final weather = Weather(
    serviceKey: 'your_service_key', // 替换为你的认证密钥
  );

  final List<ItemSuperFct> items = [];

  final json = await SuperFctRepositoryImp(isLog: isLog).getItemListJSON(weather);

  json.map((e) => setState(() => items.add(e))).toList();

  return items;
}
Future<List<ItemSuperFct>> getSuperFctListXML({isLog = false}) async {
  final weather = Weather(
    serviceKey: 'your_service_key', // 替换为你的认证密钥
  );
  final List<ItemSuperFct> items = [];

  final json = await SuperFctRepositoryImp(isLog: isLog).getItemListXML(weather);

  json.map((e) => setState(() => items.add(e))).toList();

  return items;
}

短期预报示例

以下示例展示了如何获取短期预报列表的 JSON 和 XML 数据:

Future<List<ItemFct>> getFctListJson({isLog = true}) async {
  final weather = Weather(
    serviceKey: 'your_service_key', // 替换为你的认证密钥
    pageNo: 1,
    numOfRows: 10,
  );
  final List<ItemFct> items = [];
  final json = await FctRepositoryImp(isLog: isLog).getItemListJSON(weather);

  json.map((e) => setState(() => items.add(e))).toList();

  return items;
}
Future<List<ItemFct>> getFctListXML({isLog = false}) async {
  final weather = Weather(
    serviceKey: 'your_service_key', // 替换为你的认证密钥
    pageNo: 1,
    numOfRows: 10,
  );
  final List<ItemFct> items = [];
  final json = await FctRepositoryImp(isLog: isLog).getItemListXML(weather);

  json.map((e) => setState(() => items.add(e))).toList();

  return items;
}

预报版本示例

以下示例展示了如何获取预报版本的 JSON 和 XML 数据:

Future<List<ItemFctVersion>> getFctVersionJson({isLog = true}) async {
  final List<ItemFctVersion> items = [];

  final weather = WeatherVersion(
    serviceKey: 'your_service_key', // 替换为你的认证密钥
    pageNo: 1,
    numOfRows: 100,
  );

  FctVersionRepositoryImp(isLog: isLog, customLogger: logger)
      .getItemJSON(weather)
      .then((value) => setState(() => items.add(value)));

  return items;
}
Future<List<ItemFctVersion>> getFctVersionXML({isLog = true}) async {
  final List<ItemFctVersion> items = [];

  final weather = WeatherVersion(
    serviceKey: 'your_service_key', // 替换为你的认证密钥
    pageNo: 1,
    numOfRows: 100,
  );

  FctVersionRepositoryImp(isLog: isLog, customLogger: logger)
      .getItemXML(weather)
      .then((value) => setState(() => items.add(value)));

  return items;
}

完整示例代码

下面是完整的示例代码,展示了如何在 Flutter 应用中集成 korea_weather_api 插件:

import 'dart:io';

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

import 'pages/fct_page.dart';
import 'pages/fct_version_page.dart';
import 'pages/super_fct_page.dart';
import 'pages/super_nct_page.dart';

void main() {
  HttpOverrides.global = WeatherHttpOverrides();
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const HomePage(),
    );
  }
}

class HomePage extends StatelessWidget {
  const HomePage({Key? key}) : super(key: key);

  void push(BuildContext context, Widget widget) {
    Navigator.of(context).push(
      MaterialPageRoute(builder: (context) => widget),
    );
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    const apiKey = ''; // 替换为你的认证密钥

    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: () => push(
                context,
                const SuperNctPage(apiKey: apiKey),
              ),
              child: const Text('超短期实况 (Super Nct)'),
            ),
            const SizedBox(height: 20),
            ElevatedButton(
              onPressed: () => push(
                context,
                const SuperFctPage(apiKey: apiKey),
              ),
              child: const Text('超短期预报 (Super Fct)'),
            ),
            const SizedBox(height: 20),
            ElevatedButton(
              onPressed: () => push(
                context,
                const FctPage(apiKey: apiKey),
              ),
              child: const Text('短期预报 (Fct)'),
            ),
            const SizedBox(height: 20),
            ElevatedButton(
              onPressed: () => push(
                context,
                const FctVersionPage(apiKey: apiKey),
              ),
              child: const Text('预报版本 (Fct Version)'),
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter中使用korea_weather_api插件来查询韩国天气的代码示例。请注意,这只是一个基本示例,实际应用中你可能需要处理更多的错误和边界情况。

首先,确保你已经在pubspec.yaml文件中添加了korea_weather_api依赖:

dependencies:
  flutter:
    sdk: flutter
  korea_weather_api: ^最新版本号  # 请替换为实际最新版本号

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

接下来,在你的Flutter项目中,你可以按照以下步骤使用korea_weather_api插件:

  1. 导入必要的包
import 'package:flutter/material.dart';
import 'package:korea_weather_api/korea_weather_api.dart';
  1. 配置API密钥

在实际使用之前,你需要从韩国天气API(或其他提供韩国天气数据的API服务)获取API密钥。然后,在Flutter项目的某个合适位置(如main.dart或专门的配置文件中)设置这个密钥:

void main() {
  // 设置API密钥(请替换为你的实际API密钥)
  KoreaWeatherApi.apiKey = '你的API密钥';
  runApp(MyApp());
}
  1. 查询天气数据

下面是一个简单的示例,展示如何使用korea_weather_api查询指定地区的天气数据:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: WeatherScreen(),
    );
  }
}

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

class _WeatherScreenState extends State<WeatherScreen> {
  WeatherData? weatherData;
  String? errorMessage;

  @override
  void initState() {
    super.initState();
    _fetchWeatherData('서울');  // 查询首尔天气,可以根据需要修改地区名
  }

  Future<void> _fetchWeatherData(String cityName) async {
    try {
      // 使用插件查询天气数据
      weatherData = await KoreaWeatherApi.getWeatherByCityName(cityName: cityName);
    } catch (e) {
      errorMessage = e.toString();
    }

    // 更新UI
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('韩国天气查询'),
      ),
      body: Center(
        child: weatherData != null
            ? Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  Text('城市: ${weatherData!.cityName}'),
                  Text('温度: ${weatherData!.currentTemperature}°C'),
                  Text('天气: ${weatherData!.currentWeather}'),
                ],
              )
            : errorMessage != null
                ? Text('错误: $errorMessage')
                : CircularProgressIndicator(),
      ),
    );
  }
}

// 假设WeatherData类如下(实际使用时,请参考插件的文档以获取正确的数据结构)
class WeatherData {
  String? cityName;
  double? currentTemperature;
  String? currentWeather;

  // 其他属性...

  WeatherData({this.cityName, this.currentTemperature, this.currentWeather});
}

注意

  • 上述WeatherData类是一个假设的类,用于演示目的。在实际应用中,你需要根据korea_weather_api插件返回的实际数据结构来定义这个类。
  • 插件的具体用法和返回的数据结构可能会随着版本的更新而变化,因此请参考插件的官方文档以获取最新和最准确的信息。
  • 请确保你的API密钥是安全的,不要将其硬编码在客户端应用中,而是考虑使用环境变量或后端服务来管理API密钥。
回到顶部