字母索引快速定位

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

字母索引快速定位

关于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();
                      //计算触摸点
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值