Flutter MAL API集成插件mal_api的使用

Flutter MAL API集成插件mal_api的使用

A Dart包装器,用于官方的MyAnimeList REST API。

测试与示例

要运行example目录中的示例,请确保设置了以下环境变量:

  • CLIENT_ID - 在 MAL的API配置 注册您的应用程序后获得。
  • CLIENT_SECRET - 在 MAL的API配置 注册您的应用程序后获得。
  • REDIRECT_URL - OAuth2认证后的重定向URL(必须在 MAL的API配置 的“应用重定向URL”字段中指定)。

要在test目录中运行测试,请确保设置了以下环境变量:

  • CREDENTIALS - 包含OAuth2凭据的JSON字符串(当运行example/mal_api_example.dart时生成并存储在creds.json文件中)。
  • CLIENT_ID - 在 MAL的API配置 注册您的应用程序后获得。
  • CLIENT_SECRET - 在 MAL的API配置 注册您的应用程序后获得。

在运行测试之前,请注意某些测试会修改您的动漫和漫画列表。

开始使用

要开始向MyAnimeList API发出请求,您需要一个Client对象。可以通过调用Authenticator::authenticate()来获取Client对象。有关更多信息,请参阅示例。

任何时候,如果对MyAnimeList API的请求失败,都会抛出ClientException

大多数Client方法都有一个fields参数。某些Fields还可以有子Fields。这用于指定MyAnimeList API应返回哪些字段。某些字段始终由API返回。但是,为了确保您需要的字段将被返回,请显式指定它。请注意,即使显式指定了字段,在某些情况下(例如缺少信息),字段也不会被返回。因此,请务必检查null值。

示例

查看example/mal_api_example.dart

许可证

根据MIT许可分发。有关更多信息,请参阅LICENSE

相关材料

MAL API授权文档

MAL API文档

MAL API配置

MAL API许可和开发者协议


完整示例代码

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

// 确保在运行之前设置了这些环境变量
final _id = Platform.environment['CLIENT_ID']!;
final _secret = Platform.environment['CLIENT_SECRET']!;
final _redirectUrl = Uri.parse(Platform.environment['REDIRECT_URL']!);

void main() async {
  // 用户认证
  final auth = Authenticator(
    credentialsFile: File('./creds.json'), // 凭据文件路径
    id: _id, // 应用ID
    listen: _listen, // 回调函数,用于接收重定向URL
    redirect: _redirect, // 登录页面URL
    redirectUrl: _redirectUrl, // 重定向URL
    secret: _secret, // 应用密钥
  );
  final client = await auth.authenticate(); // 获取客户端实例

  if (client != null) {
    // 请求用户动漫列表
    final animes = await client.getUserAnimeList(
      fields: [
        AnimeField.title(), // 动漫标题字段
        AnimeField.myListStatus([UserAnimeListStatusField.score()]) // 用户评分字段
      ]
    );

    // 请求用户漫画列表
    final mangas = await client.getUserMangaList(
      fields: [
        MangaField.title(), // 漫画标题字段
        MangaField.myListStatus([UserMangaListStatusField.score()]) // 用户评分字段
      ]
    );

    // 打印动漫列表
    print('\n--- 我的动漫列表 ---');
    for (final anime in animes) {
      print('${anime.title} | ${anime.myListStatus?.status} | ${anime.myListStatus?.score}');
    }

    // 打印漫画列表
    print('\n--- 我的漫画列表 ---');
    for (final manga in mangas) {
      print('${manga.title} | ${manga.myListStatus?.status} | ${manga.myListStatus?.score}');
    }
  }
}

// 处理重定向回调的函数
Future<Uri> _listen(Uri redirectUrl) async {
  stdout.writeln('请输入重定向后的URL以允许所需权限。');
  stdout.write('URL: ');
  final input = stdin.readLineSync();
  if (input != null && input.startsWith(redirectUrl.toString())) {
    return Uri.parse(input);
  } else {
    return Uri.parse('');
  }
}

// 打开登录页面的函数
Future<void> _redirect(Uri authUrl) async {
  stdout.writeln('请使用浏览器访问以下URL进行登录并授权。');
  stdout.writeln('URL: ${authUrl.toString()}\n');
}

运行步骤

  1. 注册应用
    前往 MAL的API配置页面,注册您的应用,并获取CLIENT_IDCLIENT_SECRET

  2. 设置环境变量
    设置以下环境变量:

    • CLIENT_ID
    • CLIENT_SECRET
    • REDIRECT_URL(重定向URL,必须与MAL配置一致)
  3. 运行示例代码
    将示例代码保存为main.dart,并在终端中运行:

    dart main.dart
1 回复

更多关于Flutter MAL API集成插件mal_api的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


要将MAL (MyAnimeList) API集成到Flutter应用中,你可以使用mal_api插件。这个插件简化了与MAL API的交互,使得获取和操作数据变得更加容易。以下是如何在Flutter项目中使用mal_api插件的步骤:

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加mal_api插件的依赖。

dependencies:
  flutter:
    sdk: flutter
  mal_api: ^0.1.0  # 请检查最新版本

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

2. 获取MAL API的Client ID

在使用MAL API之前,你需要在MyAnimeList开发者门户注册一个应用程序,并获取Client ID。这个Client ID将用于认证你的API请求。

3. 初始化MAL API客户端

在你的Flutter应用中,初始化mal_api客户端。通常,你可以在main.dart或某个初始化文件中进行。

import 'package:mal_api/mal_api.dart';

void main() {
  final malClient = MALClient(clientId: 'YOUR_CLIENT_ID');
  runApp(MyApp(malClient: malClient));
}

class MyApp extends StatelessWidget {
  final MALClient malClient;

  MyApp({required this.malClient});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter MAL API Demo',
      home: MyHomePage(malClient: malClient),
    );
  }
}

4. 使用MAL API获取数据

现在你可以在应用中使用malClient来获取数据。以下是一些常见的API调用示例:

获取用户信息

Future<void> fetchUserInfo() async {
  try {
    final userInfo = await malClient.getUserInfo('USERNAME');
    print('User Info: $userInfo');
  } catch (e) {
    print('Error fetching user info: $e');
  }
}

获取用户的动画列表

Future<void> fetchUserAnimeList() async {
  try {
    final animeList = await malClient.getUserAnimeList('USERNAME');
    print('Anime List: $animeList');
  } catch (e) {
    print('Error fetching anime list: $e');
  }
}

搜索动画

Future<void> searchAnime() async {
  try {
    final searchResults = await malClient.searchAnime('Naruto');
    print('Search Results: $searchResults');
  } catch (e) {
    print('Error searching anime: $e');
  }
}

5. 处理认证和授权

MAL API需要OAuth2认证来访问某些受保护的资源。mal_api插件提供了处理OAuth2认证的功能。你可以使用malClientauthenticate方法来处理认证流程。

Future<void> authenticate() async {
  try {
    await malClient.authenticate();
    print('Authentication successful');
  } catch (e) {
    print('Authentication failed: $e');
  }
}

6. 处理错误和异常

在使用API时,可能会遇到各种错误和异常。确保在调用API时使用try-catch块来处理这些错误。

7. 构建UI

最后,你可以将获取到的数据展示在Flutter的UI中。例如,使用ListView来展示动画列表。

class MyHomePage extends StatefulWidget {
  final MALClient malClient;

  MyHomePage({required this.malClient});

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

class _MyHomePageState extends State<MyHomePage> {
  List<Anime> animeList = [];

  [@override](/user/override)
  void initState() {
    super.initState();
    fetchUserAnimeList();
  }

  Future<void> fetchUserAnimeList() async {
    try {
      final list = await widget.malClient.getUserAnimeList('USERNAME');
      setState(() {
        animeList = list;
      });
    } catch (e) {
      print('Error fetching anime list: $e');
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('My Anime List'),
      ),
      body: ListView.builder(
        itemCount: animeList.length,
        itemBuilder: (context, index) {
          final anime = animeList[index];
          return ListTile(
            title: Text(anime.title),
            subtitle: Text('Episodes: ${anite.episodes}'),
          );
        },
      ),
    );
  }
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!