Flutter 如何通过单击“内外颤振”关闭覆盖层

Flutter 如何通过单击“内外颤振”关闭覆盖层,flutter,dart,Flutter,Dart,我正在创建一个覆盖,点击一个按钮,从下面的代码可以很好地工作,但是我想通过点击它的外部来关闭覆盖 参考代码: body: GestureDetector( onTap: (){ _overlayEntry?.remove(); }, child : Container( height: MediaQuery.of(context).size.height, width: MediaQuery.of(context).size.width, 对于创建覆盖,我使用的

我正在创建一个覆盖,点击一个按钮,从下面的代码可以很好地工作,但是我想通过点击它的外部来关闭覆盖

参考代码:

body: GestureDetector(
  onTap: (){
    _overlayEntry?.remove();
  },
  child : Container(
  height: MediaQuery.of(context).size.height,
  width: MediaQuery.of(context).size.width,
  • 对于创建覆盖,我使用的是OverlayEntry

  • 通过使用“偏移”设置覆盖位置,该偏移在六个按钮中的任意一个按钮上录制时可用

导入“包装:颤振/材料.省道”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
//此小部件是应用程序的根。
@凌驾
小部件构建(构建上下文){
返回材料PP(
debugShowCheckedModeBanner:false,
标题:“颤振演示”,
主题:主题数据(
主样本:颜色。蓝色,
),
主页:手势位置检测器(),
);
}
}
类GesturePositionDetector扩展了无状态小部件{
过晶过晶;
过度进入(OverlayEntry);;
@凌驾
小部件构建(构建上下文){
返回脚手架(
主体:容器(
高度:MediaQuery.of(context).size.height,
宽度:MediaQuery.of(context).size.width,
子:列(
mainAxisAlignment:mainAxisAlignment.spaceBetween,
crossAxisAlignment:crossAxisAlignment.center,
儿童:[
_getButtons([1,2,3],上下文),
_getButtons([4,5,6],上下文),
_getButtons([7,8,9],上下文)
],
)),
);
}
小部件_getButtons(列表标签、构建上下文){
var listOfButtons=List();
labels.forEach((int-label){
添加(_getButtonView('Button$label',context,label));
});
返回行(
mainAxisAlignment:mainAxisAlignment.spaceBetween,
crossAxisAlignment:crossAxisAlignment.center,
儿童:按钮列表);
}
小部件_getButtonView(字符串标签、BuildContext上下文、int索引){
返回手势检测器(
子:容器(
身高:50,
宽度:150,
边距:LTRB(15,25,15,20)的边距集,
装饰:盒子装饰(
颜色:Colors.blueAccent,
borderRadius:borderRadius.all(半径.圆形(10)),
儿童:中心(
子:文本(
标签,
样式:TextStyle(fontWeight:fontWeight.bold),
),
),
),
onTapDown:(详细信息){
onTap(详细信息、上下文、索引);
},
);
}
onTap(tappdownDetails、上下文、int索引){
var size=MediaQuery.of(context).size;
var offset=details.globalPosition;
_覆盖入口?.remove();
overlystate=Overlay.of(上下文);
_overlayEntry=新的overlayEntry(
生成器:(BuildContext上下文)=>已定位(
左:offset.dx+300>=size.width?offset.dx-300:offset.dx,
顶部:offset.dy+200>=size.height?offset.dy-200:offset.dy,
儿童:材料(
颜色:颜色。透明,
子:容器(
宽度:300,
身高:200,
子:容器(
装饰:盒子装饰(
颜色:颜色。白色70,
边界半径:边界半径。圆形(20),
boxShadow:[
箱形阴影(
颜色:颜色。灰色,
半径:5.0,
),
]),
边缘:边缘组。对称(水平:20),
填充:从LTRB(16,10,16,10)开始的边缘设置,
孩子:包裹(
crossAxisAlignment:WrapCrossAlignment.center,
对齐:wrappalignment.center,
方向:轴垂直,
间距:10,
儿童:[
正文(
"正文",,
样式:TextStyle(
fontWeight:fontWeight.bold,fontSize:25),
),
文本(“子文本1”),
文本(“子文本2”),
文本(“子文本3”),
文本(“子文本4”)
],
))),
)));
OverlyState.插入(\u OverlyEntry);
}
}

手势检测器包裹身体,轻触身体时会触发轻触事件,在轻触事件方法中关闭覆盖,如下面的代码所示

代码:

body: GestureDetector(
  onTap: (){
    _overlayEntry?.remove();
  },
  child : Container(
  height: MediaQuery.of(context).size.height,
  width: MediaQuery.of(context).size.width,