Flutter 中悬浮窗口Widget之Overlay

在开发中常常需要一个悬浮窗口来做各种筛选,实现悬浮控件需要知道悬浮控件应该出现在什么位置以及窗口的大小,而获取悬浮控件的所需的位置需要知道父控件的position。在flutter 中通过BuildContext findRenderObject获取widget的position和size。

bool _isShow = false;
OverlayEntry _overlay;
//触发事件控件的全局key ,通过key可以获取到key对应的控件
GlobalKey _tapWidget = Globalkey();

OverlayEntry _createSelectViewWithContext(BuildContext context){
    //屏幕宽高
    RenderBox  renderBox = context.findRenderObject();
    var screenSize = renderBox.size;
    //触发事件的控件的位置和大小
    renderBox = _tapWidget.findRenderObject();
    var parentSize = renderBox.size;
    var parentPosition = renderBox.localToGlobal(Offset.zero);
    //正式创建Overlay
    return OverlayEntry(
        builder: (context) => Positioned (
            top: parentPosition.dy + parentSize.height,
            width: screenSize.width,
            height:screenSize.height-parentPosition.dy-parentPosition.height,
            child:Stack(
                children:<Widget>[
                    GestureDetctor(//黑色 26透明度背景
                        onTap:(){
                            setState( () {
                             _isShow = false;
                            });
                            //点击背景 隐藏窗口
                            _showOverlay(_isShow);
                        },
                        child: Container(
                            height: screenSize.height-parentPosition.dy-parentPosition.height,
                            width:screenSize.width,
                            color:Colors.black26,
                        ),
                    ),
                    Container( height:100),//悬浮窗口自定义
                ]
            ),      
        )
    );
    
}
//现实显示具体方法 在需要的地方掉用即可
_showOverlay(bool isShow) {
    if (isShow) {
        _overlay = _createSelectViewWithContext(context);
        Overlay.of(context).inset(_overlay);
    } else {
        _overlay.remove();
    }
}

看到有人问,当页面返回时,overlay没有消失。这里说明一下overlay是Stack,是在整个app页面最上层,所以返回不会随页面消失。可以在页面的dispose()方法中掉用_overlay.remove()

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 本文介绍了Flutter应用程序中Widget,State,BuildContext和InheritedWidge...
    __white阅读 7,965评论 1 6
  • 首先,在Flutter中几乎所有的对象都是一个Widget。跟原生开发中的“控件”不同,Flutter中的Widg...
    沉江小鱼阅读 6,426评论 0 2
  • 原文在此,此处只为学习 Widget与ElementWidget主要接口Stateless WidgetState...
    lltree阅读 9,974评论 0 1
  • Flutter中Widget,State和BuildContext的概念是每个Flutter开发人员需要完全理解的...
    DramaScript阅读 11,021评论 0 1
  • 文/平平 从四月二号我开始在简书上写感受起,我暗自激励自己,每天发一篇自己的体会或者学生的文章,一定要在毕业前积累...
    春日畅想阅读 1,409评论 0 2

友情链接更多精彩内容