字母索引快速定位
关于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();
//计

这篇博客探讨了在Flutter中实现字母索引快速定位的问题,包括Context的获取、Widget的编写方式对坐标获取的影响,以及滑动定位的难点。通过示例展示了不同情况下坐标系统的差异,并提供了单击跳转、快速滑动定位的参考。
806

被折叠的 条评论
为什么被折叠?



