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>内容不工作,有行为和没有行为。