Flutter太空探索API插件spacex_api的使用

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

Flutter太空探索API插件spacex_api的使用

spacex_api 是一个用于访问 SpaceX 官方 API v4 的 Dart 包。它提供了所有端点和查询子系统的支持,可以获取与 SpaceX 及其公开数据相关的详细信息。

功能介绍

  • Capsules - 有关龙飞船胶囊的详细信息。
  • Company - 关于 SpaceX 公司的详细信息。
  • Cores - 关于一级火箭核心的详细信息。
  • Crew - 关于龙飞船乘员的详细信息。
  • Dragons - 关于龙飞船版本的详细信息。
  • Landpads - 关于着陆垫和船只的详细信息。
  • Launches - 关于发射的详细信息。
  • Launchpads - 关于发射台的详细信息。
  • Payloads - 关于发射载荷的详细信息。
  • Roadster - 关于埃隆·马斯克的特斯拉跑车的详细信息。
  • Rockets - 关于火箭版本的详细信息。
  • Ships - 关于 SpaceX 舰队中船只的详细信息。
  • Starlink - 关于星链卫星和轨道的详细信息。

示例代码

以下是一些示例代码,展示了如何使用 spacex_api 插件来获取和查询 SpaceX 的数据。

import 'dart:convert' as convert;
import 'package:http/http.dart';
import 'package:spacex_api/models/capsule.dart';
import 'package:spacex_api/models/company/company.dart';
import 'package:spacex_api/models/crew.dart';
import 'package:spacex_api/models/dragon/dragon.dart';
import 'package:spacex_api/models/history/history.dart';
import 'package:spacex_api/models/landpad.dart';
import 'package:spacex_api/models/launch/launch.dart';
import 'package:spacex_api/models/launchpad.dart';
import 'package:spacex_api/models/pagenated_response.dart';
import 'package:spacex_api/models/payload.dart';
import 'package:spacex_api/models/query/options.dart';
import 'package:spacex_api/models/roadster.dart';
import 'package:spacex_api/models/rocket/rocket.dart';
import 'package:spacex_api/models/ship.dart';
import 'package:spacex_api/models/starlink/starlink.dart';
import 'package:spacex_api/spacex_api.dart';
import 'package:spacex_api/utils.dart';

void main() async {
  final api = SpaceXApi();

  // 获取单个胶囊信息
  _fetchSingleCapsule(api);

  // 获取所有星链卫星信息
  _fetchAllStarlink(api);

  // 查询星链卫星信息
  _queryStarlinks(api);
}

Future<void> _fetchSingleCapsule(SpaceXApi api) async {
  final response = await api.getCapsuleById(id: "5e9e2c5cf359183bb73b266e");
  if (response.statusCode == 200) {
    final json = Utils.parseResponseAsJson(response);
    final capsule = Capsule.fromJson(json);
    print("Fetch Single Capsule serial -> ${capsule.serial}");
  }
}

Future<void> _fetchAllStarlink(SpaceXApi api) async {
  final response = await api.getAllStarlinks();
  if (response.statusCode == 200) {
    List<Starlink> data = Utils.convertResponseToList<Starlink>(
      response,
      (e) => Starlink.fromJson(e),
    );
    print("Fetch Starlinks ${data.length}");
  }
}

Future<void> _queryStarlinks(SpaceXApi api) async {
  final query = Options();
  query.limit = 25;
  query.page = 1;
  query.pagination = true;
  query.select = [
    "version",
    "height_km",
    "longitude",
  ];
  final response = await api.queryStarlinks(query: query.toJson());
  if (response.statusCode == 200) {
    final jsonResp = Utils.parseResponseAsJson(response);
    PagenatedResponse pagenatedResponse = PagenatedResponse.fromJson(jsonResp);
    List<Starlink> data = pagenatedResponse.docs
        .map((e) => Starlink.fromJson(e))
        .cast<Starlink>()
        .toList();
    print("Query Starlinks ${data.length}");
  }
}

// 更多示例
_parseResponse(Response response) {
  if (response.statusCode == 200) {
    final jsonResponse = convert.jsonDecode(response.body);
    return jsonResponse;
  } else {
    print('Request failed with status: ${response.statusCode}.');
  }
}

fromJsonList<T>(List json, Function func) {
  List caps = json.map((e) => func(e)).cast<T>().toList();
  return caps;
}

Future<void> _fetchShips(SpaceXApi api) async {
  final response = await api.getAllShips();
  final json = _parseResponse(response);
  if (json != null) {
    List<Ship> data = json.map((e) => Ship.fromJson(e)).cast<Ship>().toList();
    print("Fetch Ship ${data[0].name}");
  }
}

Future<void> _fetchRocket(SpaceXApi api) async {
  final response = await api.getAllRockets();
  final json = _parseResponse(response);
  if (json != null) {
    List<Rocket> data = json.map((e) => Rocket.fromJson(e)).cast<Rocket>().toList();
    print("Fetch Rocket ${data[0].name}");
  }
}

Future<void> _fetchRoadster(SpaceXApi api) async {
  final response = await api.getRoadster();
  final json = _parseResponse(response);
  if (json != null) {
    Roadster data = Roadster.fromJson(json);
    print("Fetch Roadster ${data.earthDistanceKm}");
  }
}

Future<void> _fetchPayloads(SpaceXApi api) async {
  final response = await api.getAllPayloads();
  final json = _parseResponse(response);
  if (json != null) {
    List<Payload> data = json.map((e) => Payload.fromJson(e)).cast<Payload>().toList();
    print("Fetch Payload ${data[0].name}");
  }
}

Future<void> _fetchLaunches(SpaceXApi api) async {
  final response = await api.getAllLaunches();
  final json = _parseResponse(response);
  if (json != null) {
    List<Launch> data = json.map((e) => Launch.fromJson(e)).cast<Launch>().toList();
    print("Fetch Launch ${data[0].details}");
  }
}

Future<void> _fetchLaunchPads(SpaceXApi api) async {
  final response = await api.getAllLaunchPads();
  final json = _parseResponse(response);
  if (json != null) {
    List<Launchpad> data = json.map((e) => Launchpad.fromJson(e)).cast<Launchpad>().toList();
    print("Fetch Launchpad ${data[0].name}");
  }
}

Future<void> _fetchLandpads(SpaceXApi api) async {
  final response = await api.getAllLandpads();
  final json = _parseResponse(response);
  if (json != null) {
    List<Landpad> data = json.map((e) => Landpad.fromJson(e)).cast<Landpad>().toList();
    print("Fetch Landpad ${data[0].fullName}");
  }
}

Future<void> _fetchHistory(SpaceXApi api) async {
  final response = await api.getAllHistory();
  final json = _parseResponse(response);
  if (json != null) {
    List<History> data = json.map((e) => History.fromJson(e)).cast<History>().toList();
    print("Fetch History ${data[0].title}");
  }
}

Future<void> _fetchDragons(SpaceXApi api) async {
  final response = await api.getAllDragons();
  final json = _parseResponse(response);
  if (json != null) {
    List<Dragon> data = json.map((e) => Dragon.fromJson(e)).cast<Dragon>().toList();
    print("Fetch Dragon ${data[0].name}");
  }
}

Future<void> _fetchCrew(SpaceXApi api) async {
  final response = await api.getAllCrews();
  final json = _parseResponse(response);
  if (json != null) {
    List<Crew> data = json.map((e) => Crew.fromJson(e)).cast<Crew>().toList();
    print("Fetch Crew ${data[0].name}");
  }
}

Future<void> _fetchCompany(SpaceXApi api) async {
  final response = await api.getCompany();
  final json = _parseResponse(response);
  if (json != null) {
    Company data = Company.fromJson(json);
    print("Fetch Company ${data.name}");
  }
}

更多关于Flutter太空探索API插件spacex_api的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter太空探索API插件spacex_api的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用spacex_api插件的示例代码。这个插件允许你访问SpaceX的公共API,获取关于火箭发射、飞船、任务等的数据。

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

dependencies:
  flutter:
    sdk: flutter
  spacex_api: ^latest_version  # 请替换为当前最新版本号

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

接下来,我们创建一个简单的Flutter应用来展示如何使用这个插件。

主文件 main.dart

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

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

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

class SpaceXScreen extends StatefulWidget {
  @override
  _SpaceXScreenState createState() => _SpaceXScreenState();
}

class _SpaceXScreenState extends State<SpaceXScreen> {
  List<Launch> _launches = [];
  bool _loading = false;

  @override
  void initState() {
    super.initState();
    fetchLaunches();
  }

  void fetchLaunches() async {
    setState(() {
      _loading = true;
    });

    try {
      final SpaceXApi spaceXApi = SpaceXApi();
      final List<Launch> launches = await spaceXApi.getRecentLaunches(limit: 5);
      setState(() {
        _launches = launches;
        _loading = false;
      });
    } catch (e) {
      print('Error fetching launches: $e');
      setState(() {
        _loading = false;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('SpaceX Launches'),
      ),
      body: _loading
          ? Center(child: CircularProgressIndicator())
          : ListView.builder(
              itemCount: _launches.length,
              itemBuilder: (context, index) {
                final Launch launch = _launches[index];
                return ListTile(
                  title: Text(launch.name),
                  subtitle: Text('Mission: ${launch.missionName}'),
                  trailing: IconButton(
                    icon: Icon(Icons.info),
                    onPressed: () => showLaunchDetails(launch),
                  ),
                );
              }),
    );
  }

  void showLaunchDetails(Launch launch) {
    showDialog(
      context: context,
      builder: (context) {
        return AlertDialog(
          title: Text(launch.name),
          content: SingleChildScrollView(
            child: ListBody(
              children: [
                Text('Mission Name: ${launch.missionName}'),
                Text('Mission ID: ${launch.missionId}'),
                Text('Date UTC: ${launch.dateUtc}'),
                Text('Date Local: ${launch.dateLocal}'),
                Text('Launch Site: ${launch.launchSite?.siteName ?? 'N/A'}'),
                Text('Rocket: ${launch.rocket?.name ?? 'N/A'}'),
                // 你可以根据需要添加更多字段
              ],
            ),
          ),
          actions: [
            TextButton(
              onPressed: () => Navigator.of(context).pop(),
              child: Text('Close'),
            ),
          ],
        );
      },
    );
  }
}

需要的类型定义

通常,spacex_api插件会自带一些数据模型(如Launch, Rocket等)。如果你需要查看或扩展这些模型,可以查阅插件的源代码或文档。

运行应用

确保你的开发环境已经配置好Flutter,并且设备或模拟器已经连接。运行以下命令来启动应用:

flutter run

这个示例展示了如何初始化SpaceXApi实例,获取最近的5次发射数据,并在列表中展示。点击列表项会弹出一个对话框,显示该发射的详细信息。

请注意,spacex_api插件的API可能会随时间变化,因此请查阅最新的插件文档和源代码以确保代码的正确性。

回到顶部