flutter 通讯录
工程仓库
国内的话需要梯子打开
https://www.dropbox.com/sh/u9s38957amql3yc/AABc3ncZd8L2gMtMAy83FKL0a?dl=0
如果不能下载的话请私信我
样式长这样
需求分析:
1、滑动会影响到右边的导航栏。
2、右边的导航栏具有点击和拖动的手势,位置点到的位置会影响到左边的list。
3、当list的导航栏的索引没有对应的list会选择最近的list。
4、当最后的list不占满的话,选倒数第二个list,若倒数第二个也不占满,以此类推上一个list。
需求没有说做停留索引,所以我没做了。
整体做法
页面
页面的话整体是个stack
。
占整个的是一个singleChildScrollview
,分两部分,一部分是头Container
,下面那部分是ListView
嵌套ListView
:目的是为了数据好处理。
嵌套一个导航栏:整体是Row
左边是指示器,位置是根据右边的选择来做判定,右边是一个嵌套了GestureDetector
的ListView
。GestureDetector
具有点击、滑动、取消点击的回调。
数据
创建一个长度为27的数组来存储高度(# + A~Z)。数据可能 B没有,那该位置就是上一个A的位置。当滑动的时候,根据offset
来判断当前的位置indexLocation
为右边的导航栏显示更新。
核心代码
整体的scrollview + 模拟数据
// 存储导航列表的高度位置瞄点
List<double> scrollHeightList = [];
// item高度
double itemHeight = 60;
// 导航item高度
double sessionHeight = 38.5;
// 当前选择item的位置
int indexLocation = -1;
// 最后占满屏幕的高度
double lastHeight = 0;