flutter 小说翻页实现

近期项目收尾,回顾一下flutter的小说翻页效果以及逻辑的实现.

一、主要逻辑

1、翻页效果采用的是AnimationController动画的方式
2、由于小说的章节比较多, 需要无限翻页,采用的是多页面进行内容替换的逻辑
3、难点: A页面内容的加载时机;B章节内容的加载时机;C从目录切换章节;D字体行距的切换;E内容分页

二、页面结构

整个内容采用的是一个带有手势交互的FutureBuilder视图, 采用FutureBuilder的好处是可以自然的根据网络请求返回的不同结果加载对应的数据,并且不需要手动的去setstate

Widget _bodyView() {
    return GestureDetector(
      onTapUp: (TapUpDetails details) {
        double xRate = details.globalPosition.dx / Get.width;
        if (xRate > 0.33 && xRate < 0.66) {
          NovelReadModel read = dataChapterList[currentIndex];
          widget.clickMenu(read);
        } else if (xRate >= 0.66) {
          turnPagenext = true;
          nextPage();
          autoListenTurnPage = false;
        } else {
          // 如果是第一章  则不翻页
          if (currentIndex == 1) {
            gbs.shower.toast("已经是第一页了");
            return;
          }
          turnPagenext = false;
          previousPage();
          autoListenTurnPage = false;
        }
      },
      onPanDown: (details) {
        handsTapDetails = details;
      },
      onHorizontalDragUpdate: _onHorizontalDragUpdate,
      onHorizontalDragEnd: (_) => _onHorizontalDragEnd(),
      onHorizontalDragCancel: _resetAnimation,
      child: FutureBuilder(),// 伪代码
    );
  }

从代码中可以看出,
翻页不仅仅支持左右滑动页面onHorizontalDragUpdate方法处理
还可以支持点击视图的边缘onTapUp: (TapUpDetails details) {的方式去切换

WechatIMG3525.jpg

单页面内容包含了头部的章节菜单和底部的文章内容
其中内容采用的是富文本加载方便听书时的进度显示

三、翻页

书籍有很多内容, 我们采用一个数组L,首次存储三个章节的内容(上一章、本章节、下一章)
翻页的重点逻辑在_onHorizontalDragEnd的方法里面,这个方法是手势结束的方法,.需要通过手势的坐标变化来确定是上一页还是下一页
1、我们拿下一页来举例
下一页要做一下几个事情
(1)、是不是本书的最后一张最后一页, 如果是则需要将后面的一页替换为完本页面
(2)、如果数组L中没有下一章的数据(网络不佳就会没有下一章),需要进行网络请求填充下一章
(3)、更新当前页码和数组下标
(4)、讲停留在页面中间的动画执行完毕
(5)、刷新下一页内容
(6)、统计埋点
(7)、记录历史记录(存本地数据库)
(8)、根据需要向服务器上传历史记录
历史记录中涉及到一个章节阅读字数的计算问题, 可以根据需要取本页的第一个字和最后一个字中间的字


WechatIMG3527.jpg

刷新上一页下一页内容

pageCenter.autoNext();
      // 更新center页面(1、将第二页的内容替换为第三页 2、让第二页返回视觉上代替第三页)
await Future.delayed(const Duration(milliseconds: 100));
pageCenter.refresh(_pageCenterChild(dataChapterList[currentIndex].content, dataChapterList[currentIndex], true));
await Future.delayed(const Duration(milliseconds: 200));
pageCenter.noanimaPrevious();
pageBottom.refresh(_pageDefaultChild(dataChapterList[currentIndex + 1].content, dataChapterList[currentIndex + 1], false));

四、切换章节
切换章节有多种方案, 主要思路还是替换数组中的内容, 并刷新页面
我这里采用了一个最简单粗暴的方案:
1、清空数组L中所有数据
2、重新获取前后三章的数据
3、计算当前章节第一页的下标刷新当前页面内容

五、小结

小说翻页总体来讲逻辑还是比较复杂的,
由于功能点比较多又比较碎, 很容易产生各种bug 比如: 切换字体字号后当前页面的内容刷新问题、又比如快速翻页到章节变更的数据刷新问题
主要整体思路没问题剩下的只要细心豆可以搞定

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • 这几天做项目因为数据太多,需要对信息进行上下翻页展示,就自己写了翻页的代码大致功能就是页面只显示几条信息,按上一页...
    喜洋洋咯阅读 1,115评论 0 4
  • 一、阅读器整体设计 阅读器的基本功能是文字展示、翻页滚动,以及目录展示、进度切换、调整字号和主题切换等,扩展功能包...
    辉辉岁月阅读 1,514评论 0 1
  • 前言 19年做了一个小说阅读器,特此介绍阅读器设计,还有实现过程中的一些坑。 正文 一、阅读器整体设计 阅读器的基...
    落影loyinglin阅读 5,735评论 6 30
  • iOS网络架构讨论梳理整理中。。。 其实如果没有APIManager这一层是没法使用delegate的,毕竟多个单...
    yhtang阅读 5,164评论 1 23
  • 一款完整的小说阅读器功能包含: 阅读主页面的图文混排 翻页效果:仿真,平移,滚动,覆盖,无效果 设置功能:字号更改...
    皮乐皮儿阅读 204评论 0 1