如何关闭颤振中的所有叠加层

How to close all overlays in flutter

我构建了一个屏幕,该屏幕构建了一个包含搜索栏小部件的叠加层。

因为我在一个 class 中构建了覆盖调用,然后加载一个包含搜索栏的单独小部件 class。我不知道如何从活动搜索栏关闭叠加层 class。

我曾尝试创建一个关闭或处置函数,但这仅在从启动覆盖的父 class 而不是包含搜索小部件的子 class 调用时有效。

在这种情况下是否可以使用关闭或终止所有覆盖功能?

或者当搜索小部件为 运行 时,从子 class 调用驻留在父 class 中的处置/关闭覆盖函数的方法?

我能想到的唯一解决方法是将叠加层和搜索栏功能重建为一个 class,这似乎是错误的。

如果您查看 Overlay 的代码,您会看到 gem:

看到高亮部分了吗? Flutter 在内部使用一个名为“_entries”的私有变量,它可以访问当前显示的所有叠加层。

然而这是一个私有变量。因此,要回答您的问题,除非您保留对所有覆盖条目的引用然后手动关闭它们,否则您不能要求系统为您执行此操作。

我遇到了同样的问题,这是我的解决方案。我在打开新叠加层之前调用了关闭函数:

// OVERLAYS
OverlayEntry? overlayWidget;

void closeOverlay() {
  if ( overlayWidget == null || overlayWidget?.mounted == false) return;
  overlayWidget?.remove();
  overlayWidget = null;
}

void overlayWidgetDialog(BuildContext context, {required Widget child}) {
  // avoid stacking
  closeOverlay();
  overlayWidget = OverlayEntry(
      // maintainState: true,
      // opaque: true,
      builder: (context) {
        return child;
      });

  Overlay.of(context)?.insert(overlayWidget!);
}