Flutter 如何在屏幕上的某个地方用颤振键隐藏覆盖层
我编写了一个Flutter 如何在屏幕上的某个地方用颤振键隐藏覆盖层,flutter,flutter-layout,Flutter,Flutter Layout,我编写了一个小部件,其中包含一个按钮。点击此按钮,将显示一个小“框”,其中包含一些文本信息。 我用覆盖解决了这个问题。这个覆盖层的内部是一个手势检测器。当您点击Overlay时,Overlay将被隐藏。 由于覆盖没有填满整个屏幕,因此如果您点击该覆盖后面,它将不会关闭。 但我希望当您点击屏幕上的某个位置时,覆盖将被隐藏,可能在覆盖之外 以下是覆盖的一部分: class _OverlayHelpWidgetState extends State<OverlayHelpWidget> {
小部件
,其中包含一个按钮
。点击此按钮
,将显示一个小“框”,其中包含一些文本信息。
我用覆盖解决了这个问题。这个覆盖层的内部是一个手势检测器
。当您点击Overlay
时,Overlay
将被隐藏。
由于覆盖
没有填满整个屏幕,因此如果您点击该覆盖
后面,它将不会关闭。
但我希望当您点击屏幕上的某个位置时,覆盖
将被隐藏,可能在覆盖
之外
以下是覆盖的一部分:
class _OverlayHelpWidgetState extends State<OverlayHelpWidget> {
OverlayEntry _overlayEntry;
OverlayState _overlayState;
bool _isVisible = false;
@override
Widget build(BuildContext context) {
return Row(
children: [
Center(
child: GestureDetector(
child: Icon(
Icons.help,
color: Colors.green[800],
),
onTap: () {
showHelp();
},
),
)
],
mainAxisAlignment: MainAxisAlignment.end,
);
}
OverlayEntry _createOverlayEntry() {
return OverlayEntry(
builder: (context) => Align(
alignment: Alignment.center,
child: GestureDetector(
child: _createContent(),
onTap: () {
hideHelp();
},
),
),
);
}
showHelp() async {
if (!_isVisible) {
_overlayState = Overlay.of(context);
_overlayEntry = _createOverlayEntry();
_overlayState.insert(_overlayEntry);
_isVisible = true;
}
}
void hideHelp() {
_isVisible = false;
_overlayEntry.remove();
}
class\u OverlayHelpWidgetState扩展状态{
过度进入(OverlayEntry);;
过酸盐_过酸盐;
bool _isVisible=false;
@凌驾
小部件构建(构建上下文){
返回行(
儿童:[
居中(
儿童:手势检测器(
子:图标(
图标。帮助,
颜色:颜色。绿色[800],
),
onTap:(){
showHelp();
},
),
)
],
mainAxisAlignment:mainAxisAlignment.end,
);
}
OverlayEntry_createOverlayEntry(){
返回重叠入口(
生成器:(上下文)=>Align(
对齐:对齐.center,
儿童:手势检测器(
子项:_createContent(),
onTap:(){
隐藏帮助();
},
),
),
);
}
showHelp()异步{
如果(!\u可见){
_overlystate=Overlay.of(上下文);
_overlayEntry=_createOverlayEntry();
_OverlyState.插入(\u OverlyEntry);
_isVisible=true;
}
}
void hideHelp(){
_isVisible=false;
_覆盖入口。移除();
}
有人能帮我解决吗
谢谢你,比尔斯谢谢你,普金斯
这就是解决方案。更改为此,它可以工作:
OverlayEntry _createOverlayEntry() {
return OverlayEntry(
builder: (context) => GestureDetector(
behavior: HitTestBehavior.translucent,
child: Align(
alignment: Alignment.center,
child: _createContent(),
),
onTap: () {
hideHelp();
},
),
);
}
谢谢你,普金
这就是解决方案。更改为此,它可以工作:
OverlayEntry _createOverlayEntry() {
return OverlayEntry(
builder: (context) => GestureDetector(
behavior: HitTestBehavior.translucent,
child: Align(
alignment: Alignment.center,
child: _createContent(),
),
onTap: () {
hideHelp();
},
),
);
}
GestureDetector>Align>\u createContent()
也许?也可以使用GestureDetector.behavior
Property添加一个布尔变量,指示框是否显示,并在行
->GestureDetector
的方法中检查该布尔值并执行适当的方法(showHelp/HideHelp)GestureDetector>Align>\u createContent()
maybe?还可以玩gesturedetor。行为
property您可以添加一个布尔变量,指示框是否显示,并在行的点击方法中检查该布尔值并执行相应的方法(showHelp/HideHelp)没有behavior:HitTestBehavior.translucent
它不起作用(但具有相同的层次结构:检测器>对齐>内容)?没有行为,它不会改变任何东西。有了行为,它工作正常。好的,谢谢,但实际上我想知道原始对齐>检测器>内容是否也能起作用(当然有HitTestBehavior.transparent
)…你能检查一下它是否可以测试吗?align>detector>内容不起作用,有没有行为。没有行为:HitTestBehavior.transparent
它不起作用(但具有相同的层次结构:detector>align>content)?没有行为,它不会改变任何东西。有行为,它工作正常。好的,谢谢,但实际上我想知道原始的align>detector>内容是否也能工作(当然有HitTestBehavior.Transparent
)…你能检查它只是为了测试吗?align>detector>内容不工作,有行为和没有行为。