- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在尝试制作如下所示的叠加层: 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();
}
此时,您可以使用didPush
和didPopNext
来显示/隐藏您的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/
假设我有两条路线 /firstRoute 和 /secondRoute , 对于小部件 第一路和 二线分别。我正在使用一些参数将命名路由插入堆栈,就像这样...... Navigator.pushNa
之前可能有人问过,但我找不到,但是如何将参数传递给命名路由? 这就是我构建路线的方式 Widget build(BuildContext context) { return new Navig
我想用我的 CustomPageRoute在 Navigator.pushNamed()但我找不到使用它的方法。 但是,我可以通过以下方式使用它 Navigator.push(context, Cus
我需要将一些参数发送到命名路由。我想做类似的事情: Navigator.pushNamed('/route/1'); 或者 Navigator.pushNamed('/route?param1=1')
我想要做的是在我使用 http 客户端从网络获取一些信息时显示一个具有加载状态的小部件。然后根据结果自动导航到不同的路线。 这是我的代码: class Home extends StatelessWi
我正在尝试将注册屏幕移至 OTP 屏幕。从注册屏幕我需要将电子邮件 ID 传递到 OTP 屏幕。现在,我在下面使用,但无法解析参数:其中的参数。 Navigator.pushNamed(context
我使用 pushNamed() 从屏幕获取返回数据,如下所示: _pushToPage2() async { String result = await Navigator.pushNamed
我可以用 MaterialPageRoute 做到这一点: Navigator.push( context, MaterialPageRoute( builder: (context
我正在尝试创建一个 Dismissible 小部件,但我想要路由器历史记录,我的意思是当我使用 onDismissed 事件转到另一条路线时,当用户在该新 View 上按下后退按钮时将返回到第一个 V
谁能在 Flutter 中概述 push 与 pushNamed 的优缺点? 做一些研究,我唯一能找到的是 this GitHub issue要求同样的事情。 这是我的理解: 推送 不使用字符串,因此
我有一个 routing像这样: routes: { '/': (context) => MainPage(), '/othe_page': (context) => OthePage
所以基本上我正在开发一个货币应用程序,在您使用应用程序货币向您的帐户收费后,我验证了付款是否已完成,我需要重定向到主页,但每次都会崩溃,当所有其他自定义路线正在运行。 app.dart:(这是我的路线
我正在尝试制作如下所示的叠加层: https://www.didierboelens.com/2018/06/how-to-create-a-toast-or-notifications-notion
下面类 TestWidget 中的 build 函数在执行导航代码时被调用两次。 Test Widget 在控制台上打印了两次。 有谁知道为什么会这样? class TestWidget exten
使用 Flutter,我试图通过构造函数将数据传递到新屏幕。 但是,这有点特殊,因为屏幕是有状态的小部件,我使用的是 Navigation Routes 导航方法。 如果重要的话,数据也恰好是 int
我是一名优秀的程序员,十分优秀!