Flutter通过Overlay实现下拉筛选菜单效果

一、效果图

二、 实现方式

  1. 在需要显示筛选菜单的页面build中包裹一个Overlay组件
  2. 获取固定在顶部筛选头部Widget在屏幕上的位置和它的高度
  3. 在弹窗中通过获取到的高度进行内容显示区域定位
  4. 巧用AnimatedContainer组件实现下拉动画效果
  5. 最后在底部加上黑色蒙层
_overlayEntry = OverlayEntry(builder: (_) {
      return Padding(
        padding: EdgeInsets.only(top: startY),
        child: Column(
          children: [
            ColoredBox(
              color: Colors.white,
              child: Column(
                children: [
                  Container(
                    height: 1,
                    margin: const EdgeInsets.symmetric(horizontal: 16),
                    color: const Color(0xfff6f7f9).withOpacity(0.8),
                  ),
                  ValueListenableBuilder<double>(
                    valueListenable: _notifier,
                    builder: (context, value, child) {
                      return AnimatedContainer(
                        height: value,
                        curve: Curves.fastEaseInToSlowEaseOut,
                        duration: const Duration(milliseconds: 300),
                        child: child,
                      );
                    },
                    child: widget.content,
                  ),
                ],
              ),
            ),
            Expanded(
              child: GestureDetector(
                onTap: () => widget.controller.close(),
                behavior: HitTestBehavior.opaque,
                child: Container(
                  color: Colors.black.withOpacity(0.7),
                ),
              ),
            ),
          ],
        ),
      );
    });
Overlay.of(context).insert(_overlayEntry!);

三、具体代码可查看此处的完整Demo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Code-Porter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值