gpt4 book ai didi

flutter - 如何在 Flutter 中使用 pushNamed 导航后使 OverlayEntry 消失

转载 作者:IT王子 更新时间:2023-10-29 06:56:04 27 4
gpt4 key购买 nike

我正在尝试制作如下所示的叠加层: https://www.didierboelens.com/2018/06/how-to-create-a-toast-or-notifications-notion-of-overlay/使用 OverlayEntry .

import 'package:flutter/material.dart';
import 'dart:async';

class ShowNotificationIcon {

void show(BuildContext context) async {
OverlayState overlayState = Overlay.of(context);
OverlayEntry overlayEntry = new OverlayEntry(builder: _build);

overlayState.insert(overlayEntry);
}

Widget _build(BuildContext context){
return new Positioned(
top: 50.0,
left: 50.0,
child: new Material(
color: Colors.transparent,
child: new Icon(Icons.warning, color: Colors.purple),
),
);
}
}

调用方式:

ShowNotificationIcon _icon = new ShowNotificationIcon();

_icon.show(context);

但是,当我尝试导航到其他屏幕时,叠加层仍保留在屏幕中。

如何只在调用它的屏幕上显示叠加层,而不在其他屏幕上显示?

以防万一,这是我在我的有状态小部件中尝试过的:

  ShowNotificationIcon _icon = new ShowNotificationIcon();

@override
void initState() {
WidgetsBinding.instance.addPostFrameCallback((_) {
_icon.show(context);
});

super.initState();
}

@override
void dispose() {
_icon.remove();
super.dispose();
}

最佳答案

这通常使用 RouteAware+RouteObserver 执行。

RouteObserver 是一个对象,它让实现了 RouteAware 的对象对一些与路由相关的变化使用react,包括:

  • 已将一条路线推到当前路线的顶部
  • 路线又回到了第一个计划

然后您可以使用这两个事件来隐藏/显示您的叠加层


首先,您需要一个RouteObserver

这可以创建为全局变量,需要传递给您的 Navigator。在基于 MaterialApp 的应用程序中,它通常看起来像这样:

final RouteObserver<PageRoute> routeObserver = RouteObserver<PageRoute>();

void main() {
runApp(MaterialApp(
home: Container(),
navigatorObservers: [routeObserver],
));
}

然后,您拥有 OverlayEntry 的小部件现在可以像这样实现 RouteAware:

class RouteAwareWidget extends StatefulWidget {
State<RouteAwareWidget> createState() => RouteAwareWidgetState();
}

// Implement RouteAware in a widget's state and subscribe it to the RouteObserver.
class RouteAwareWidgetState extends State<RouteAwareWidget> with RouteAware {

@override
void didChangeDependencies() {
super.didChangeDependencies();
// routeObserver is the global variable we created before
routeObserver.subscribe(this, ModalRoute.of(context) as PageRoute);
}

@override
void dispose() {
routeObserver.unsubscribe(this);
super.dispose();
}

@override
void didPush() {
// Route was pushed onto navigator and is now topmost route.
}

@override
void didPopNext() {
// Covering route was popped off the navigator.
}

@override
Widget build(BuildContext context) => Container();

}

此时,您可以使用didPushdidPopNext 来显示/隐藏您的OverlayEntry:

OverlayEntry myOverlay;

@override
void didPush() {
myOverlay.remove();
}

@override
void didPopNext() {
Overlay.of(context).insert(myOverlay);
}

关于flutter - 如何在 Flutter 中使用 pushNamed 导航后使 OverlayEntry 消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57217939/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com