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
。
相关材料
完整示例代码
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');
}
运行步骤
-
注册应用
前往 MAL的API配置页面,注册您的应用,并获取CLIENT_ID
和CLIENT_SECRET
。 -
设置环境变量
设置以下环境变量:CLIENT_ID
CLIENT_SECRET
REDIRECT_URL
(重定向URL,必须与MAL配置一致)
-
运行示例代码
将示例代码保存为main.dart
,并在终端中运行:dart main.dart
更多关于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认证的功能。你可以使用malClient
的authenticate
方法来处理认证流程。
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}'),
);
},
),
);
}
}