Flutter书籍信息查询插件isbndb的使用

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

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 包含与该主题相关的书籍的数组

第三方包

这个应用程序使用了一些外部库:

  • Freezed 用于生成不可变模型
  • Dio 用于HTTP请求

致谢

这个包最初是我个人需求而创建的,但你可以自由使用它,它涵盖了ISBNdb API的所有功能,我会维护它。

我没有与ISBNdb有任何关系,我只是需要使用这个API并创建了这个库。

如果你有问题,请在Twitter上提问。

许可证

LICENSE: MIT


示例代码

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

1 回复

更多关于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';
    }
  }
}

注意事项

  1. API Key:你需要从 ISBNDB 网站获取一个 API 密钥,并将其替换为 'YOUR_API_KEY'
  2. 依赖版本:确保你使用的是最新版本的 isbndb 包。如果版本有更新,请在 pubspec.yaml 中更新版本号。
  3. 错误处理:示例代码中包含了基本的错误处理,但你可能需要根据实际需求进行更详细的错误处理。

这个示例展示了如何使用 isbndb 包来搜索书籍,并显示书籍的基本信息。你可以根据需要进一步扩展这个示例,例如显示更多书籍信息、添加加载指示器等。

回到顶部