You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Flutter中如何关闭通过Navigator.overlay插入的CustomOverlay?

解决Flutter中关闭自定义Overlay的问题

你遇到的问题根源在于:你操作的是整个Overlay容器,而非你插入的单个OverlayEntry实例。直接调用Navigator.of(context).overlay.dispose()会尝试销毁整个页面的Overlay,这显然不是关闭单个自定义Overlay的正确方式。

正确的做法是保留你创建的OverlayEntry的引用,通过这个引用调用remove()dispose()方法来精准关闭目标Overlay。

修改后的代码示例

// 1. 创建OverlayEntry并保存引用
final OverlayEntry overlayEntry = OverlayEntry(builder: (BuildContext context) {
  return CustomOverlay();
});

// 2. 将OverlayEntry插入到Overlay容器中
Navigator.of(context).overlay.insert(overlayEntry);

// 3. 需要关闭时,调用以下方法之一
overlayEntry.remove(); // 推荐使用,会自动触发Overlay的UI更新
// 或者
overlayEntry.dispose();

如果需要在CustomOverlay内部触发关闭

如果你的CustomOverlay自带关闭按钮(比如右上角的关闭图标),可以通过回调将overlayEntry的引用传递给Overlay内部:

final OverlayEntry overlayEntry = OverlayEntry(builder: (BuildContext context) {
  return CustomOverlay(
    onClosePressed: () {
      overlayEntry.remove();
    },
  );
});
Navigator.of(context).overlay.insert(overlayEntry);

然后在CustomOverlay的定义中添加对应的回调参数:

class CustomOverlay extends StatelessWidget {
  final VoidCallback onClosePressed;

  const CustomOverlay({Key? key, required this.onClosePressed}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Stack(
      children: [
        // 你的自定义Overlay内容
        Positioned(
          top: 16,
          right: 16,
          child: IconButton(
            icon: const Icon(Icons.close),
            onPressed: onClosePressed,
          ),
        ),
      ],
    );
  }
}

这样点击关闭按钮时,就能精准移除你插入的OverlayEntry了。


内容的提问来源于stack exchange,提问作者Danique de Jong Dan

火山引擎 最新活动