[Flutter]从零开始实现一个嵌套滑动的PageView(三)

3,201

目录

  1. [Flutter]从零开始实现一个嵌套滑动的PageView(一)
  2. [Flutter]从零开始实现一个嵌套滑动的PageView(二)
  3. [Flutter]从零开始实现一个嵌套滑动的PageView(三)

前言

前面两篇文章基本实现了所需的功能,那么综合整合一下,并做一些稍微的拓展

思路整合

1. 基本整体上的思路

由最底层的子PageView负责计算,正常情况下按一般的pageView的逻辑来,当遇到需要嵌套滑动的时候,计算出滑动结果并调用父Page的controller。

所以按照这个逻辑,底层的scrollerController就是操作核心,计算逻辑什么的放在那里,然后需要的时候控制父page就行

2. 计算核心逻辑

正常情况直接参考pageView 的就行,我们唯一需要考虑的是嵌套滑动情况,这部分参考nestedScrollerView的部分,说白了就是判断一下是否是过度滑动、快速滑动什么的,在需要的情况下交给父ScrollerController处理。所幸的是,基本的动画、复位算法,已经有现成方法实现,是否是过度滑动也可以通过controller所绑定的position中携带的pixel、maxScrollExtent、minScrollExtent等信息来判断,所以问题也不大

3、如何打通父page和子Page

还是参考NestedScrollerView,PrimaryScrollerController提供了一种传递controller的方式,所以父Page只需要将自己的controller放入PrimaryScrollerController这个InHeritedWidget即可,子Page通过它就能拿到controller,进而控制父page的滑动。

需要做的事

1.修改pageView,使其有PrimaryScroolerController
2.自定义ScrollerController,提供position和相关必要信息
3.自定义ScrollerPosition,并让其继承ScrollActivityDelegate,自定义activity和控制逻辑,加入计算核心逻辑

还可以拓展一下

套娃功能,现在目前是父page和子page是分开的,但是想一想,父page其实也就提供自己controller一个很小的功能,完全可以整合到子page中去,直接用一个pageView自动判断需不需要嵌套功能嘛(说白了就是判断下能不能通过PrimaryScrollerController拿到父page的自定义ScrollerController就行了)

2020.3.16 更新,已加入上述功能

现在可以公开的情报

  1. 支持无限嵌套

  2. 可以设置某个嵌套页面的初始pageView 的展示index

基本效果Look

基本功能
基本功能

项目地址

使用demo见评论第一个

https://gist.github.com/lwlizhe/558ee91b691a7d9e6873f16d9abccf78

后记

谁能想到这个春节假期这么长……回来人傻了,差点认不出我之前写的啥…………赶快插个眼理一下思路

顺便水个文章,调整下状态。

事实证明,一个月不敲代码,有些东西就能忘得差不多……