字母索引快速定位
关于Context的获取
将Widegt写到方法体中与单独写成一个Wiget的区别在于能否拿到context
///右栏的字母表
Widget _buildLetterIndexView(BuildContext context) => Positioned(
// top: getScreenUtilHeight(55),
right: 0,
bottom: 75,
width: ScreenUtil().setHeight(30),
child: Container(
alignment: Alignment.centerLeft,
padding: EdgeInsets.symmetric(vertical: ScreenUtil().setHeight(5)),
color: Colors.transparent,
// color: Colors.amberAccent,
child: Column(
children: _presenter
.getIndexTags()
.map((letter) => GestureDetector(
onTapDown: (details) {
setState(() {
_onTap = letter;
jumpToLetter(letter);
});
},
onTapUp: (details) {
setState(() {
_onTap = '';
});
},
onLongPressStart: (details) {
setState(() {
_onTap = letter;
});
jumpToLetter(letter);
},
onLongPressEnd: (details) {
setState(() {
_onTap = '';
});
},
onVerticalDragStart: (start) {
//获取滑动点击的屏幕坐标
//获取点触摸到的标签的父盒子,indexBar
final RenderBox rb = context.findRenderObject();
//计算触摸点在父盒子中的相对位置
var local = rb.globalToLocal(start.globalPosition);
//获取单个标签的高度
final double hight =
rb.size.height / _presenter.getIndexTags().length;
print('hight:$hight');
//求当前触摸的标签的index
final int index =
(local.dy / _presenter.getIndexTags().length).round();
print('当前的index:$index');
setState(() {
if (index <= 0) {
_onTap = _presenter.getIndexTags().first;
} else if (index >= _presenter.getIndexTags().length) {
_onTap = _presenter.getIndexTags().last;
} else {
_onTap = _presenter.getIndexTags()[index];
}
});
jumpToLetter(_onTap);
},
onVerticalDragUpdate: (details) {
//获取滑动点击的屏幕坐标
//获取点触摸到的标签的父盒子,indexBar
final RenderBox rb = context.findRenderObject();
//计算触摸点