我使用flushbar来向用户显示应用内通知,但我认为这个问题适用于任何想要覆盖当前屏幕的小部件,比如Snackbar。
结果将如下所示(当返回到第一个屏幕时,我希望通知仍停留在屏幕上): 编辑2: George的解决方案可行。此外,使用覆盖层也可能是其他人的适当解决方案(请参见这篇博客文章),即,即使在路由导航期间,覆盖层仍保持在屏幕上。但是,在我的情况下,覆盖层解决方案不太优雅,因为它不允许flushbar被解除或动画化(或者至少不是那么简单)。
相关问题:Flutter - 应用程序范围通知
我希望能够显示一个独立于屏幕间导航的通知,也就是说,如果用户在屏幕之间导航,通知应该留在所有屏幕上。因为Flushbar通知仅在当前BuildContext上绘制,所以当用户关闭当前屏幕时,通知也会消失(因为通知小部件是该屏幕小部件子树的一部分)。
有没有一种方法可以在整个应用程序的顶部显示小部件(如通知),而不管导航如何?
EDIT1:添加了示例代码。
import 'package:flushbar/flushbar_route.dart' as route;
import 'package:flushbar/flushbar.dart';
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: FirstScreen(),
);
}
}
class FirstScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('First Screen'),
),
body: Center(
child: RaisedButton(
child: Text('go to second screen'),
onPressed: () {
Navigator.of(context).push(
MaterialPageRoute(builder: (BuildContext context) => SecondScreen())
);
},
),
),
);
}
}
class SecondScreen extends StatelessWidget {
final Flushbar _flushbar = Flushbar(message: 'Flushbar Notification');
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Second Screen'),
),
body: Center(
child: RaisedButton(
child: Text('show flushbar'),
onPressed: () {
showFlushbar(_flushbar, context);
},
),
),
);
}
}
Future showFlushbar(Flushbar instance, BuildContext context) {
final _route = route.showFlushbar(
context: context,
flushbar: instance,
);
return Navigator.of(context, rootNavigator: true).push(_route);
}
结果将如下所示(当返回到第一个屏幕时,我希望通知仍停留在屏幕上): 编辑2: George的解决方案可行。此外,使用覆盖层也可能是其他人的适当解决方案(请参见这篇博客文章),即,即使在路由导航期间,覆盖层仍保持在屏幕上。但是,在我的情况下,覆盖层解决方案不太优雅,因为它不允许flushbar被解除或动画化(或者至少不是那么简单)。
相关问题:Flutter - 应用程序范围通知
Navigator.of(context).pop()
),它也会关闭Flushbar(可能是因为当前屏幕的所有子路由也从导航器中弹出)。 - chris.pop()
函数。 - George Zvonov.pop()
,但是当点击appBar上的返回按钮时,问题是相同的。 - chris