关于CosmosEpub仅恢复阅读章节无法恢复具体页码的技术问询
解决CosmosEpub恢复阅读进度时仅恢复章节、无法恢复章节内页码的问题
问题分析
你当前的代码逻辑是先读取进度、设置章节和页码,再打开书籍,但CosmosEpub 0.0.2版本的openLocalBook方法仅接收starterChapter参数,没有直接传入起始页码的入口;同时提前调用setCurrentPageIndex可能无法被后续打开书籍的操作识别,导致页码被重置为章节第1页。
可行解决方案
1. 调整设置页码的时机(书籍打开后再设置)
将设置页码的操作移到书籍打开完成的回调中(如果CosmosEpub支持onBookOpened这类回调),确保书籍初始化完成后再恢复页码:
Future<void> _openEpubReader() async { try { print('Fetching book progress...'); BookProgressModel? bookProgress = await CosmosEpub.getBookProgress(widget.bookTitle); int startChapterIndex = bookProgress?.currentChapterIndex ?? 0; int startPageIndex = bookProgress?.currentPageIndex ?? 0; print('Opening local EPUB book...'); await CosmosEpub.openLocalBook( localPath: widget.filePath, context: context, bookId: widget.bookTitle, starterChapter: startChapterIndex, onBookOpened: () async { // 书籍加载完成后再设置页码 await CosmosEpub.setCurrentPageIndex(widget.bookTitle, startPageIndex); // 如果SDK提供翻页到指定页码的方法,直接调用更可靠 // await CosmosEpub.flipToPage(startPageIndex); }, onPageFlip: (int currentPage, int totalPages) { CosmosEpub.setCurrentPageIndex(widget.bookTitle, currentPage); }, ); } catch (e) { print('Error opening EPUB: $e'); } }
2. 验证页码存储的准确性
确认onPageFlip回调中的currentPage是章节内的相对页码,而非全书的绝对页码:
- 如果
currentPage是全书总页码,需要先转换为当前章节内的相对页码再存储,否则恢复时会对应错误位置。 - 可以打印
bookProgress?.currentPageIndex的值,确认存储的页码和实际阅读的章节内页码一致。
3. 升级CosmosEpub版本
0.0.2属于早期版本,可能存在进度恢复的bug。尝试升级到最新版本,查看官方更新日志是否修复了章节内页码恢复的问题。
4. 手动触发翻页(如果SDK支持)
如果上述方法无效,且SDK提供了手动翻页的API(比如flipPage或jumpToPage),可以在书籍打开后循环调用翻页方法,直到到达目标页码:
onBookOpened: () async { // 从第1页开始翻到目标页码 for (int i = 1; i < startPageIndex; i++) { await CosmosEpub.flipPage(); } },
内容的提问来源于stack exchange,提问作者Samuel Aberra
相关产品推荐
相关产品推荐

