Flutter电子书阅读插件epub_view的使用

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

Flutter电子书阅读插件epub_view的使用

epub_view 是一个纯Flutter小部件(非原生),可以在所有平台上查看EPUB文档。它基于 epub 包,在任何平台上使用Flutter小部件渲染(非原生视图):WebMacOSWindowsLinuxAndroidiOS

展示

展示

开始使用

在您的Flutter项目中添加依赖:

flutter pub add epub_view

使用示例

下面是一个完整的示例,展示了如何使用 epub_view 插件来创建一个简单的电子书阅读器应用。

示例代码

import 'package:epub_view/epub_view.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart' show SystemChrome, SystemUiOverlayStyle;

void main() => runApp(const MyApp());

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> with WidgetsBindingObserver {
  @override
  void initState() {
    WidgetsBinding.instance.addObserver(this);
    super.initState();
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  @override
  void didChangePlatformBrightness() {
    _setSystemUIOverlayStyle();
  }

  Brightness get platformBrightness =>
      MediaQueryData.fromView(WidgetsBinding.instance.window)
          .platformBrightness;

  void _setSystemUIOverlayStyle() {
    if (platformBrightness == Brightness.light) {
      SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
        statusBarBrightness: Brightness.light,
        statusBarIconBrightness: Brightness.dark,
        systemNavigationBarColor: Colors.grey[50],
        systemNavigationBarIconBrightness: Brightness.dark,
      ));
    } else {
      SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
        statusBarBrightness: Brightness.dark,
        statusBarIconBrightness: Brightness.light,
        systemNavigationBarColor: Colors.grey[850],
        systemNavigationBarIconBrightness: Brightness.light,
      ));
    }
  }

  @override
  Widget build(BuildContext context) => MaterialApp(
        title: 'Epub demo',
        theme: ThemeData(
          primarySwatch: Colors.blue,
          brightness: Brightness.light,
        ),
        darkTheme: ThemeData(
          primarySwatch: Colors.blue,
          brightness: Brightness.dark,
        ),
        debugShowCheckedModeBanner: false,
        home: const MyHomePage(),
      );
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key}) : super(key: key);

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  late EpubController _epubReaderController;

  @override
  void initState() {
    _epubReaderController = EpubController(
      document:
          EpubDocument.openAsset('assets/New-Findings-on-Shirdi-Sai-Baba.epub'),
    );
    super.initState();
  }

  @override
  void dispose() {
    _epubReaderController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) => Scaffold(
        appBar: AppBar(
          title: EpubViewActualChapter(
            controller: _epubReaderController,
            builder: (chapterValue) => Text(
              chapterValue?.chapter?.Title?.replaceAll('\n', '').trim() ?? '',
              textAlign: TextAlign.start,
            ),
          ),
          actions: <Widget>[
            IconButton(
              icon: const Icon(Icons.save_alt),
              color: Colors.white,
              onPressed: () => _showCurrentEpubCfi(context),
            ),
          ],
        ),
        drawer: Drawer(
          child: EpubViewTableOfContents(controller: _epubReaderController),
        ),
        body: EpubView(
          builders: EpubViewBuilders<DefaultBuilderOptions>(
            options: const DefaultBuilderOptions(),
            chapterDividerBuilder: (_) => const Divider(),
          ),
          controller: _epubReaderController,
        ),
      );

  void _showCurrentEpubCfi(context) {
    final cfi = _epubReaderController.generateEpubCfi();

    if (cfi != null) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(
          content: Text(cfi),
          action: SnackBarAction(
            label: 'GO',
            onPressed: () {
              _epubReaderController.gotoEpubCfi(cfi);
            },
          ),
        ),
      );
    }
  }
}

从上次阅读位置开始

要从上次的阅读位置开始,可以使用 epubCfi 参数初始化 EpubController。例如:

_epubReaderController = EpubController(
  // 使用epub cfi字符串初始化以从上次位置打开书籍
  epubCfi: 'epubcfi(/6/6[chapter-2]!/4/2/1612)',
);

然后将控制器附加到 EpubView 小部件:

EpubView(
  controller: _epubReaderController,
);

获取当前的 epubCfi 字符串:

final cfi = _epubReaderController.generateEpubCfi();

或者使用控制器进行导航:

_epubReaderController.gotoEpubCfi('epubcfi(/6/6[chapter-2]!/4/2/1612)');

打开文档

打开本地文档

EpubDocument.openAsset('assets/sample.pdf')

EpubDocument.openData(FutureOr<Uint8List> data)

// 不支持Web平台
EpubDocument.openFile('path/to/file/on/device')

打开网络文档

安装 internet_file 包(支持所有平台):

flutter pub add internet_file

然后使用它:

import 'package:internet_file/internet_file.dart';

// 需要在服务器上设置CORS策略。
// 您可以启动自己的CORS代理。
EpubDocument.openData(InternetFile.get('https://link.to/book.epub'))

控制文档

获取当前视图的 epubCfi 字符串:

final cfi = _epubReaderController.generateEpubCfi();

导航到文档中的段落:

_epubReaderController.gotoEpubCfi('epubcfi(/6/6[chapter-2]!/4/2/1612)');

文档回调

EpubView(
  controller: epubController,
  
  onExternalLinkPressed: (href) {},

  onDocumentLoaded: (document) {},
  onChapterChanged: (chapter) {},
  onDocumentError: (error) {},
);

通过以上内容,您可以快速上手使用 epub_view 插件来构建一个功能齐全的电子书阅读器应用。


更多关于Flutter电子书阅读插件epub_view的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter电子书阅读插件epub_view的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用epub_view插件来展示电子书(EPUB格式)的示例代码。这个示例将展示如何设置基本的Flutter项目,集成epub_view插件,并加载一个EPUB文件。

第一步:设置Flutter项目

首先,确保你已经安装了Flutter和Dart的开发环境。然后,创建一个新的Flutter项目:

flutter create epub_reader_app
cd epub_reader_app

第二步:添加依赖

pubspec.yaml文件中添加epub_view依赖:

dependencies:
  flutter:
    sdk: flutter
  epub_view: ^0.5.6  # 请检查最新版本号并替换

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

第三步:配置Android权限(如果需要)

如果你打算从设备存储中读取EPUB文件,你可能需要在android/app/src/main/AndroidManifest.xml中添加读取存储的权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

第四步:编写代码

lib/main.dart文件中,编写以下代码来展示EPUB文件:

import 'package:flutter/material.dart';
import 'package:epub_view/epub_view.dart';
import 'package:path_provider/path_provider.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter EPUB Reader',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: EpubReaderScreen(),
    );
  }
}

class EpubReaderScreen extends StatefulWidget {
  @override
  _EpubReaderScreenState createState() => _EpubReaderScreenState();
}

class _EpubReaderScreenState extends State<EpubReaderScreen> {
  late EpubController _epubController;

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

  void _initEpubController() async {
    // 你可以从设备存储、网络或应用资源中加载EPUB文件
    // 这里假设你有一个名为'sample.epub'的文件在应用的assets目录中
    var byteData = await rootBundle.load('assets/sample.epub');
    Uint8List epubBytes = byteData.buffer.asUint8List();

    // 初始化EpubController
    _epubController = EpubController(
      ...EpubController.initFromData(epubBytes),
      autoPlay: true, // 自动播放
      navigationController: NavigationController(
        onPageChange: (page) {
          print("Current page: $page");
        },
      ),
    );

    // 设置初始章节
    _epubController.gotoChapter(0);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('EPUB Reader'),
      ),
      body: Center(
        child: _epubController.isReady
            ? EpubView(
                controller: _epubController,
              )
            : CircularProgressIndicator(),
      ),
    );
  }

  @override
  void dispose() {
    _epubController.dispose();
    super.dispose();
  }
}

第五步:添加EPUB文件到assets

  1. pubspec.yamlflutter部分添加assets路径:
flutter:
  assets:
    - assets/sample.epub
  1. 将你的sample.epub文件放到assets文件夹中(如果没有,请先创建它)。

第六步:运行应用

最后,运行你的Flutter应用:

flutter run

这个示例展示了如何使用epub_view插件在Flutter应用中展示EPUB电子书。你可以根据需要进一步自定义和扩展这个基础示例。

回到顶部