「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战」。

前言

前面对ListView的基本结构,运行方式做了分析,大概“拆解”了一下ListView;

那么作为一个熊孩子,下一件该做的事,就是重新组装回去;

当然,不按照自己的想法去改造组件,怎么能叫熊孩子呢?

熊孩子的想法:

  • 首先的想法来自于我以前的一个练手项目——flutter_novel(说来惭愧,已经两年没更新了,现在还有人在Star;当初说好的重构,也在一次次加班中被遗忘了):

    • 原先的项目中,每个翻页效果都是独立的自定义View;现在想依靠一个View,通过切换配置的方式来统一实现;
    • 根据上述设计思路,也要要求能够提供出手势数据,从而实现根据手势信息,对单独页面信息进行修改;
  • 可能有人看过我之前的中秋主题投稿,可以说它的实现方式也是魔改ListView,现在也想将这个变换Item、自定义路径的效果,能提供给ListView;

根据需求,分析一下实现方式:

  • 如果想支持通过配置来更改不同的View滑动效果,经过前面的分析,那么可以从这几个方向入手:

    • 修改ScrollController;通过对手势事件的处理, 拦截并修改事件为自己需要的事件;
    • 修改ViewPort;修改ViewPort中的数据,使展示窗口符合自己要求;
    • 修改SliverList;使最终显示的内容符合要求;
  • 提供手势数据,这个可以在ListView中再插入一个 ChangeNotifier ,在Scrollable 的 setCanDrag 方法中将这个数据存进去;Item则通过of方法获取这个 ChangeNotifier, 并监听处理数据;

  • 对ListView本身的自定义路径、变换Item功能的支持,在我之前的文章中,是通过修改SliverList的方式来实现的;这样做确实能实现功能,但也要注意重写hitTest方法,将hit结果转换为变换之后的Item的位置;这个过程就要涉及到之前包裹item的一堆RenderObject这块的处理;这次考虑一下有没有更好的方式;

大体的设计思路:

参考android RecyclerView的设计思路,在其中引入LayoutManager的概念;

LayoutManager类似于ListView的childDelegate,传入到Element层,Element层也会接管RenderObject层的paint、layout、hitTest方法,并传给LayoutManager处理;

而LayoutManager就需要实现paint、layout、hitTest这块的方法;

至于将这个LayoutManger 传给哪个Element和其对应的RenderObject ,就具体情况具体分析一下,以后再说;

结语

熊孩子拆组件系列结束,现在开始是熊孩子装组件系列