目录
- [Flutter]从零开始实现一个嵌套滑动的PageView(一)
- [Flutter]从零开始实现一个嵌套滑动的PageView(二)
- [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 更新,已加入上述功能
现在可以公开的情报
支持无限嵌套
可以设置某个嵌套页面的初始pageView 的展示index
基本效果Look
项目地址
使用demo见评论第一个
https://gist.github.com/lwlizhe/558ee91b691a7d9e6873f16d9abccf78
后记
谁能想到这个春节假期这么长……回来人傻了,差点认不出我之前写的啥…………赶快插个眼理一下思路
顺便水个文章,调整下状态。
事实证明,一个月不敲代码,有些东西就能忘得差不多……