Flutter NASA APIs集成插件nasa_apis的使用
Flutter NASA APIs 集成插件 nasa_apis 的使用
NASA APIs
此插件为 NASA 开放 API 提供了一个包装器,并带有缓存和实用工具功能,以实现无缝集成。它提供了特定于 Dart 的方式来处理可用请求并提供解析后的响应,包括可配置的缓存管理和数据管理。
有关 NASA API 的信息,请参阅 NASA Open APIs 文档。
该包装器与 NASA 或其 API 在任何方面均无隶属关系。它是为了我们自己的使用而创建的,并公开发布以支持开源社区。
前提条件
NASA 建议,如果您预计会大量使用 API(例如,在您正在开发的应用程序中),则应注册一个 API 密钥。访问 https://api.nasa.gov/ 获取免费密钥。
使用
要使用此插件,需要在 pubspec.yaml
文件中添加 nasa_apis
作为依赖项。
示例
以下是一些小示例,展示了如何使用 API。提供的示例不包含所有 API。请查阅文档以获取更多信息。
所有请求将返回一个包含两个项目的元组,第一个项目是一个整数 HTTP 响应代码,第二个项目是数据项。
配置
配置插件以使用 API 密钥,重新路由日志,更改缓存持续时间等。
Nasa.init(
apiKey: "INSERT YOUR API KEY",
apodSupport: true,
apodCacheSupport: true,
apodDefaultCacheExpiration: const Duration(days: 90)
);
天文每日一图 (APOD)
查看文档以了解 ApodItem 的字段数据。通常,数据将包括 uuid、版权、日期、解释、hdUrl、媒体类型、serviceVersion、如果视频则有 thumbnailUrl、标题和 url。
请求
使用 API 进行请求以获取指定日期的数据。如果启用了缓存,则所有请求(除了 requestByRandom())都将被缓存,因此重新请求它们将更快且不会计入 NASA API 请求限制。
// 按日期请求
Tuple2<int, ApodItem?> itemPair = await requestByDate(DateTime(2005, 9, 13));
// 按月份请求
Tuple2<int, List<ApodItem>?> itemPair = await requestByMonth(2012, 1);
// 随机请求
const int count = 7;
Tuple2<int, List<ApodItem>?> itemsPair = await requestByRandom(count);
// 按日期范围请求
DateTime startDate = DateTime(2022, 10, 1);
DateTime endDate = DateTime(2022, 10, 7);
Tuple2<int, List<ApodItem>?> itemPair = await requestByRange(startDate, endDate);
更新和检索类别
可以向项目添加类别并保存。也可以使用提供的搜索函数搜索类别。ApodItem 中的 ‘expiration’ 字段可以更新为不同的过期时间,或者设置为 null 以使其持久化。
ApodItem apodItem = ...;
apodItem.categories.add("example");
apodItem.expiration = DateTime.now().add(const Duration(days: 3));
await updateItemCache(apodItem: apodItem);
List<ApodItem> items = await getCategory(category: "example");
火星探测车照片
请求火星探测车漫游者数据
// 请求探测车清单
Tuple2<int, MarsRoverManifest?> result = await NasaMarsRover.requestManifest(_selectedRover);
// 请求按火星日请求
Tuple2<int, List<MarsRoverPhotoItem>?> result = await NasaMarsRover.requestByMartianSol(_selectedRover, 15);
// 请求按地球日期请求
Tuple2<int, List<MarsRoverPhotoItem>?> result = await NasaMarsRover.requestByEarthDate([_selectedRover], _marsRoverAvailablePhotosDate);
// 获取前一天有照片的日期
Tuple2<int, DateTime?> result = await NasaMarsRover.getPreviousDayWithPhotos(_marsRoverAvailablePhotosDate, rovers: [_selectedRover]);
// 获取后一天有照片的日期
Tuple2<int, DateTime?> result = await NasaMarsRover.getNextDayWithPhotos(_marsRoverAvailablePhotosDate, rovers: [_selectedRover]);
// 获取有效照片日期范围
Tuple2<int, Tuple2<DateTime, DateTime>?> result = await NasaMarsRover.getValidPhotoRange(rovers: [_selectedRover]);
完整示例代码
import 'package:flutter/material.dart';
import 'package:nasa_apis/nasa_apis.dart';
import 'package:tuple/tuple.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'NASA Open APIs Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'NASA APIs Example'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
[@override](/user/override)
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
static const String _widgetNasaApod = "APOD";
static const String _widgetNasaMarsRover = "MARS ROVER";
String _selected = _widgetNasaApod;
String _selectedRover = NasaMarsRover.roverCuriosity;
String _testDescription = "The parameters of the request will appear here.";
List<ApodItem> _apodTestResults = [];
MarsRoverManifest? _manifest;
List<MarsRoverPhotoItem>? _marsRoverPhotoItems;
DateTime _marsRoverAvailablePhotosDate = DateTime.now();
[@override](/user/override)
void initState() {
super.initState();
init();
}
/// The async initialization
void init() async {
await Nasa.init(
logReceiver: (String msg, String name) {
// ignore: avoid_print
print("$name: $msg");
},
);
await NasaApod.init(
cacheSupport: true,
cacheExpiration: const Duration(seconds: 20),
);
await NasaMarsRover.init(
cacheSupport: true,
cacheExpiration: const Duration(minutes: 2),
);
}
[@override](/user/override)
Widget build(BuildContext context) {
List<Widget> widgets = [];
// 添加下拉菜单
widgets.add(
DropdownButton<String>(
hint: Text(_selected),
items: [
_widgetNasaApod,
_widgetNasaMarsRover,
].map((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
}).toList(),
onChanged: (String? value) {
if (value != null) {
setState(() {
_selected = value;
});
}
},
),
);
// 如果选择了 APOD,则添加 APOD 特定内容
if (_selected == _widgetNasaApod) {
widgets.add(
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextButton(
onPressed: () async {
_apodTestResults.clear();
DateTime date = DateTime.now();
Tuple2<int, ApodItem?> result = await NasaApod.requestByDate(date);
_testDescription = "requestByDate()\ndate[${date.toString()}]\nhttp response code: ${result.item1.toString()}";
if (result.item2 != null) {
_apodTestResults.add(result.item2!);
}
setState(() {});
},
child: const Text("requestByDate"),
),
// 其他按钮省略...
],
),
);
widgets.add(Text(_testDescription));
for (ApodItem apodItem in _apodTestResults) {
widgets.add(
Padding(
padding: const EdgeInsets.all(15),
child: Text(
apodItem.toString(),
),
),
);
}
}
if (_selected == _widgetNasaMarsRover) {
widgets.add(
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
DropdownButton<String>(
hint: Text(_selectedRover),
items: [
NasaMarsRover.roverSpirit,
NasaMarsRover.roverOpportunity,
NasaMarsRover.roverCuriosity,
NasaMarsRover.roverPerseverance
].map((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
}).toList(),
onChanged: (String? value) {
if (value != null) {
setState(() {
_selectedRover = value;
});
}
},
),
// 其他按钮省略...
],
),
);
widgets.add(Text(_testDescription));
if (_manifest != null) {
widgets.add(
Padding(
padding: const EdgeInsets.all(15),
child: Text(
_manifest.toString(),
),
),
);
if (_manifest!.dayInfoItems != null) {
for (MarsRoverDayInfoItem dayInfoItem in _manifest!.dayInfoItems!) {
widgets.add(
Padding(
padding: const EdgeInsets.all(15),
child: Text(
dayInfoItem.toString(),
),
),
);
}
_manifest = null;
}
}
if (_marsRoverPhotoItems != null) {
for (MarsRoverPhotoItem marsRoverPhotoItem in _marsRoverPhotoItems!) {
widgets.add(
Padding(
padding: const EdgeInsets.all(15),
child: Text(
marsRoverPhotoItem.toString(),
),
),
);
}
_marsRoverPhotoItems = null;
}
}
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: SingleChildScrollView(
child: Column(
children: widgets,
),
),
);
}
}
更多关于Flutter NASA APIs集成插件nasa_apis的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter NASA APIs集成插件nasa_apis的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter项目中集成并使用nasa_apis
插件的示例代码。这个插件允许你访问NASA的公开API,获取各种天文数据。
1. 添加依赖
首先,在你的pubspec.yaml
文件中添加nasa_apis
插件的依赖:
dependencies:
flutter:
sdk: flutter
nasa_apis: ^latest_version_here # 请替换为实际的最新版本号
然后运行flutter pub get
来安装依赖。
2. 配置API Key
NASA的API需要API Key来访问。你需要在NASA的开放API门户注册并获取一个API Key。获取API Key后,你需要将其配置在你的Flutter应用中。通常,你可以将其保存在环境变量或配置文件中。
3. 使用nasa_apis
插件
下面是一个简单的示例,展示如何使用nasa_apis
插件来获取NASA的每日图片(Astronomy Picture of the Day, APOD)。
import 'package:flutter/material.dart';
import 'package:nasa_apis/nasa_apis.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'NASA APIs Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: NasaApisDemo(),
);
}
}
class NasaApisDemo extends StatefulWidget {
@override
_NasaApisDemoState createState() => _NasaApisDemoState();
}
class _NasaApisDemoState extends State<NasaApisDemo> {
String? apodImageUrl;
String? apodTitle;
String? apodDate;
@override
void initState() {
super.initState();
_fetchApod();
}
Future<void> _fetchApod() async {
final nasaApis = NasaApis(apiKey: 'YOUR_API_KEY_HERE'); // 请替换为你的API Key
try {
final apodResponse = await nasaApis.getApod();
setState(() {
apodImageUrl = apodResponse.hdUrl ?? apodResponse.url;
apodTitle = apodResponse.title;
apodDate = apodResponse.date;
});
} catch (e) {
print('Error fetching APOD: $e');
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('NASA APIs Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
apodImageUrl != null
? Image.network(apodImageUrl!, height: 300, width: double.infinity,)
: CircularProgressIndicator(),
SizedBox(height: 20),
Text(apodTitle ?? 'Loading...'),
SizedBox(height: 10),
Text('Date: ${apodDate ?? 'Loading...'}'),
],
),
),
);
}
}
注意事项
- API Key: 确保将
YOUR_API_KEY_HERE
替换为你从NASA API门户获取的实际API Key。 - 错误处理: 示例代码中简单地打印了错误,但在实际项目中,你可能需要更详细的错误处理,例如向用户显示错误消息。
- UI优化: 根据需要优化UI,例如添加加载状态、错误重试按钮等。
这个示例展示了如何使用nasa_apis
插件获取NASA的每日图片,并将其显示在Flutter应用中。你可以根据NASA API的文档探索更多功能,例如获取火星车照片、太空天气预报等。