Flutter书籍信息查询插件isbndb的使用
Flutter书籍信息查询插件isbndb的使用
Dart/Flutter包用于使用ISBNdb API
这个包是一个可以直接使用的ISBNdb API。
⚠️ 你需要一个API密钥才能使用此服务。要获取它,请在ISBNdb上创建一个帐户。
你可以免费试用7天。
API特性
这个包允许你使用ISBNdb API的所有功能。
在对API进行任何请求之前,你需要用以下代码初始化服务类:
final isbnDb = ISBNdb("your_key_here");
书籍
获取书籍详情
final book = isbnDb.getBook("9781092297370");
final book = isbnDb.getBook("9781092297370", withPrices: true);
参数 | 描述 |
---|---|
String isbn | 书籍数据库中的ISBN 10或ISBN 13 |
bool withPrices = false | 是否显示实时价格。仅在Pro计划下可用 |
使用ISBN列表获取多本书籍(需要ISBNdb.com上的Pro计划)
final books = isbnDb.getBooksFromISBNs(["9781092297370", "9781680506952"]);
参数 | 描述 |
---|---|
List | 书籍数据库中的ISBN 10或ISBN 13的列表 |
搜索书籍
final books = isbnDb.getBooks("Google Flutter", {
page: 1,
pageSize: 20,
});
参数 | 描述 |
---|---|
String query | 在书籍数据库中搜索的字符串 |
String page | 要检索的页码,请注意无论如何分页,API都不会返回超过10,000个结果 |
String pageSize | 每页应返回多少项,最大为1,000 |
BookColumn column | 限制搜索到某一列 |
BookColumn
是一个枚举,包含以下值:
- title - 仅在书籍标题中搜索
- author - 仅按给定作者搜索书籍
- date_published - 仅搜索特定年份的书籍,例如1998
作者
获取作者详情
final author = isbnDb.getAuthor("Bussi Michel", {
page: 1,
pageSize: 20,
});
参数 | 描述 |
---|---|
String name | 作者数据库中的作者名 |
String page | 要检索的页码,请注意无论如何分页,API都不会返回超过10,000个结果 |
String pageSize | 每页应返回多少项,最大为1,000 |
搜索作者
final author = isbnDb.getAuthors("werber", {
page: 1,
pageSize: 20,
});
参数 | 描述 |
---|---|
String query | 在作者数据库中搜索的字符串 |
String page | 要检索的页码,请注意无论如何分页,API都不会返回超过10,000个结果 |
String pageSize | 每页应返回多少项,最大为1,000 |
出版商
获取出版商详情
final publisher = isbnDb.getPublisher("Nathan", {
page: 1,
pageSize: 20,
});
参数 | 描述 |
---|---|
String name | 出版商数据库中的出版商名 |
String page | 要检索的页码,请注意无论如何分页,API都不会返回超过10,000个结果 |
String pageSize | 每页应返回多少项,最大为1,000 |
搜索出版商
final publisher = isbnDb.getPublishers("Nathan", {
page: 1,
pageSize: 20,
});
参数 | 描述 |
---|---|
String query | 在出版商数据库中搜索的字符串 |
String page | 要检索的页码,请注意无论如何分页,API都不会返回超过10,000个结果 |
String pageSize | 每页应返回多少项,最大为1,000 |
主题
获取主题详情
final subject = isbnDb.getSubject("Flutter");
参数 | 描述 |
---|---|
String name | 主题数据库中的主题名称 |
搜索主题
final subject = isbnDb.getSubjects("flutter", {
page: 1,
pageSize: 20,
});
参数 | 描述 |
---|---|
String query | 在主题数据库中搜索的字符串 |
String page | 要检索的页码,请注意无论如何分页,API都不会返回超过10,000个结果 |
String pageSize | 每页应返回多少项,最大为1,000 |
模型
AuthorQueryResult
名称 | 类型 | 描述 |
---|---|---|
total | int | 结果数量 |
authors | List | 包含作者的数组 |
Author
名称 | 类型 | 描述 |
---|---|---|
author | String | 作者名 |
books | List | 包含该作者书籍的数组 |
BookQueryResult
名称 | 类型 | 描述 |
---|---|---|
total | int | 结果数量 |
books | List | 包含该查询书籍的数组 |
Book
名称 | 类型 | 描述 |
---|---|---|
title | String | 书籍标题 |
titleLong | String | 长版本标题 |
isbn | String | ISBN |
isbn13 | String | 新的13位ISBN |
deweyDecimal | String | 官方API未记录 |
binding | String | 官方API未记录 |
publisher | String | 出版社名称 |
datePublished | DateTime | 书籍出版日期,可以是一年或完整的日期 |
edition | String | 版本详情 |
pages | int | 书籍页数 |
dimensions | String | 书籍尺寸 |
overview | String | 官方API未记录 |
image | String | 封面URL |
msrp | double | 官方API未记录 |
excerpt | String | 书籍摘录 |
synopsys | String | 书籍概要 |
authors | List | 作者列表 |
subjects | List | 书籍主题列表 |
reviews | List | 官方API未记录 |
prices | List | 包含销售此书的商家及其实时价格的列表 |
related | List | 官方API未记录 |
Merchant
名称 | 类型 | 描述 |
---|---|---|
condition | String | 结果数量 |
merchant | String | 商家名称 |
merchantLogo | String | 商家标志URL |
merchantLogoOffset | Map | 官方API未记录 |
shipping | String | 运费 |
price | String | 书籍价格 |
total | String | 官方API未记录 |
link | String | 购买链接 |
PublisherQueryResult
名称 | 类型 | 描述 |
---|---|---|
total | int | 结果数量 |
publishers | List | 包含出版社的数组 |
Publisher
名称 | 类型 | 描述 |
---|---|---|
name | String | 出版社名称 |
books | List | 包含该出版社书籍的数组 |
SubjectQueryResult
名称 | 类型 | 描述 |
---|---|---|
total | int | 结果数量 |
subjects | List | 包含主题的数组 |
Subject
名称 | 类型 | 描述 |
---|---|---|
subject | String | 主题 |
books | List | 包含与该主题相关的书籍的数组 |
第三方包
这个应用程序使用了一些外部库:
致谢
这个包最初是我个人需求而创建的,但你可以自由使用它,它涵盖了ISBNdb API的所有功能,我会维护它。
我没有与ISBNdb有任何关系,我只是需要使用这个API并创建了这个库。
如果你有问题,请在Twitter上提问。
许可证
示例代码
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:intl/intl.dart';
import 'package:isbndb/isbndb.dart';
void main() async {
runApp(App());
}
class App extends StatefulWidget {
App({Key? key}) : super(key: key);
[@override](/user/override)
createState() => _AppState();
}
class _AppState extends State<App> {
bool isLoading = false;
Book? book;
final textEditingController = TextEditingController();
[@override](/user/override)
void initState() {
super.initState();
textEditingController.addListener(() {
final value = textEditingController.text;
if (value.length == 13) {
_search(value);
}
});
}
[@override](/user/override)
void dispose() {
textEditingController.dispose();
super.dispose();
}
Future<void> _search(String isbn) async {
setState(() {
isLoading = true;
book = null;
});
final isbnDb = ISBNdb("your_key_here");
try {
final _book = await isbnDb.getBook(isbn);
SystemChannels.textInput.invokeMethod('TextInput.hide');
setState(() {
book = _book;
isLoading = false;
});
} catch (e) {
setState(() {
isLoading = false;
});
}
}
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
appBar: AppBar(
backgroundColor: Colors.amber,
title: TextField(
keyboardType: TextInputType.number,
style: TextStyle(fontSize: 18),
controller: textEditingController,
decoration: InputDecoration(
hintText: "Type an ISBN...",
focusedBorder: InputBorder.none,
enabledBorder: InputBorder.none,
suffixIcon: Container(
child: IconButton(
onPressed: () {
textEditingController.clear();
setState(() {
book = null;
});
},
icon: Icon(Icons.clear, size: 28, color: Colors.black),
),
),
),
),
),
body: Padding(
padding: EdgeInsets.all(15),
child: LayoutBuilder(builder:
(BuildContext context, BoxConstraints viewportConstraints) {
if (isLoading) {
return Center(
child: CircularProgressIndicator(),
);
} else if (book != null) {
return SingleChildScrollView(
child: ConstrainedBox(
constraints: BoxConstraints(
minHeight: viewportConstraints.maxHeight,
),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
if (book!.image != null)
Container(
height: 200,
width: 150,
child: Image.network(book!.image!),
),
BookRow(label: "Title:", value: book!.title),
if (book!.authors != null)
BookRow(
label: "Author(s):",
value: book!.authors!.join(' - ')),
if (book!.pages != null)
BookRow(
label: "Number of pages:",
value: "${book!.pages!} pages"),
if (book!.publisher != null)
BookRow(label: "Publisher:", value: book!.publisher!),
if (book!.datePublished != null)
BookRow(
label: "Published on:",
value: DateFormat.yMMMMd()
.format(book!.datePublished!)),
if (book!.synopsys != null)
BookRow(label: "Synopsys:", value: book!.synopsys!),
],
),
),
);
} else {
return Text("ISBN example to test this app: 9781092297370");
}
}),
),
),
);
}
}
class BookRow extends StatelessWidget {
const BookRow({
Key? key,
required this.label,
required this.value,
}) : super(key: key);
final String label;
final String value;
[@override](/user/override)
Widget build(BuildContext context) {
return Padding(
padding: EdgeInsets.only(top: 10),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
label,
style: TextStyle(
fontSize: 17,
fontWeight: FontWeight.bold,
color: Colors.grey.shade700,
),
),
Text(
value,
style: TextStyle(
fontSize: 17,
),
),
],
),
);
}
}
更多关于Flutter书籍信息查询插件isbndb的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter书籍信息查询插件isbndb的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个使用 isbndb
包来查询 Flutter 书籍信息的示例代码。这个示例展示了如何在 Flutter 应用中集成 isbndb
包,并查询书籍信息。
首先,确保在 pubspec.yaml
文件中添加 isbndb
依赖:
dependencies:
flutter:
sdk: flutter
isbndb: ^0.2.0 # 请注意版本号,使用最新版本
然后,运行 flutter pub get
来获取依赖。
接下来,编写 Flutter 应用代码。以下是一个简单的示例,展示了如何使用 isbndb
包来查询书籍信息:
import 'package:flutter/material.dart';
import 'package:isbndb/isbndb.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter ISBNDB Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: BookSearchPage(),
);
}
}
class BookSearchPage extends StatefulWidget {
@override
_BookSearchPageState createState() => _BookSearchPageState();
}
class _BookSearchPageState extends State<BookSearchPage> {
final TextEditingController _controller = TextEditingController();
String _result = '';
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter ISBNDB Book Search'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: <Widget>[
TextField(
controller: _controller,
decoration: InputDecoration(
labelText: 'Enter ISBN or book title',
),
),
SizedBox(height: 16),
ElevatedButton(
onPressed: _searchBook,
child: Text('Search'),
),
SizedBox(height: 16),
Text(
_result,
style: TextStyle(fontSize: 18),
),
],
),
),
);
}
Future<void> _searchBook() async {
setState(() {
_result = 'Searching...';
});
String query = _controller.text;
Isbndb isbndb = Isbndb(apiKey: 'YOUR_API_KEY'); // 请替换为您的ISBNDB API密钥
try {
var result = await isbndb.searchByKeyword(query);
if (result.isNotEmpty) {
var firstBook = result.first;
_result = '''
Title: ${firstBook.title}
Author: ${firstBook.authors.join(', ')}
ISBN: ${firstBook.isbn13}
Publisher: ${firstBook.publisher}
Published Date: ${firstBook.publishDate}
''';
} else {
_result = 'No books found.';
}
} catch (e) {
_result = 'Error: $e';
}
}
}
注意事项:
- API Key:你需要从 ISBNDB 网站获取一个 API 密钥,并将其替换为
'YOUR_API_KEY'
。 - 依赖版本:确保你使用的是最新版本的
isbndb
包。如果版本有更新,请在pubspec.yaml
中更新版本号。 - 错误处理:示例代码中包含了基本的错误处理,但你可能需要根据实际需求进行更详细的错误处理。
这个示例展示了如何使用 isbndb
包来搜索书籍,并显示书籍的基本信息。你可以根据需要进一步扩展这个示例,例如显示更多书籍信息、添加加载指示器等。