我使用 flushbar向用户显示应用内通知,但我认为这个问题适用于任何想要覆盖在当前屏幕上的小部件,例如 snackbar 。
我希望能够显示独立于屏幕之间导航的通知,即,如果用户在屏幕之间导航,则通知应保留在所有屏幕上。由于 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);
}
结果将如下所示(返回第一个屏幕时我希望通知保留在屏幕上):
EDIT2: George 的解决方案有效。此外,使用叠加层也可能是其他人的合适解决方案(请参阅 this blog post ),即即使在路线导航期间,叠加层也会保留在屏幕上。然而,覆盖解决方案在我的案例中不太优雅,因为它不允许 flushbar 被关闭或动画化(或者至少它不是那么简单)。
最佳答案
尝试从根导航器显示您的 Flushbar。
查看the sources flushbar lib,我们可以通过导入 showFlushbar 创建我们自己的 Flushbar 路由方法来自 package:flushbar/flushbar_route.dart .
例如
import 'package:flushbar/flushbar_route.dart' as route;
// ...
Future showFlushbar(Flushbar instance) {
final _route = route.showFlushbar(
context: context,
flushbar: instance,
);
return Navigator.of(context, rootNavigator: true).push(_route);
}
感谢您在问题中添加的代码。
在我看来,最终的解决方案是创建另一个 Navigator就在MaterialApp里面- 某种第二个“子根”导航器。
现在您可以在 Navigator 的 2 层之间进行选择取决于您的需求。
Navigator.of(context, rootNavigator: true)将返回顶级导航器 - 将它用于您的 Flushbar 或您希望在所有屏幕上方保持持久的任何其他模式弹出窗口。
Navigator.of(context) , 其中rootNavigator是false默认。使用它来获取“子根”导航器以显示新屏幕/页面。
例如放置另一个 Navigator就在MaterialApp .
MaterialApp(
home: Navigator( // 'sub-root' navigator. Second in the hierarchy.
onGenerateRoute: (_) => MaterialPageRoute(
builder: (_) => FirstScreen(),
settings: RouteSettings(isInitialRoute: true),
),
),
);
如果这有帮助,请告诉我。
关于Flutter 在任何 BuildContext 上绘制 Flushbar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56664760/
我尝试使用不同的ssh_options在同一阶段运行capistranov.3任务。我的production.rb说:set:stage,:productionset:user,'deploy'set:ssh_options,{user:'deploy'}通过此配置,capistrano与用户deploy连接,这对于其余的任务是正确的。但是我需要将它连接到服务器中配置良好的an_other_user以完成一项特定任务。然后我的食谱说:...taskswithoriginaluser...task:my_task_with_an_other_userdoset:user,'an_othe
您好,我正在做Rails应用程序,当我捆绑安装时它返回一个错误:无法在任何来源中找到coffee-script-source-1.1.3我知道coffee-script-source-1.1.3gem已被弃用/取消,但我的其他gem与此有依赖关系。但是这个项目正在与其他机器和heroku产品一起工作。如何在不更改我的gemfile的情况下成功捆绑安装?谢谢 最佳答案 运行这个:bundleupdate--sourcecoffee-script-source如果出现错误,如下所示:Anerroroccurredwhileinstall
一、环境变量右键点击我的电脑-属性:然后找到环境变量 1.Android的SDK不在C盘的话需要额外配这个到用户环境变量:ANDROID_HOMED:\AndroidSDK2.然后在系统变量:Path中添加一条这样的值 D:\Flutter\flutter\bin 这个值写flutter包解压的实际地址即可 3.在系统变量中添加两个镜像变量: 变量名:FLUTTER_STORAGE_BASE_URL 变量值:https://storage.flutter-io.cn 变量名:PUB_HOSTED_URL 变量
我正在寻找一种简单的方法来绘制大约10个点和矩形,以便能够查看我的算法哪里出了问题。我查看了gnuplot,但似乎绘制矩形特别糟糕。 最佳答案 SVG(MDNTutorial)是一种非常简单的基于文本(XML)的格式,您可以使用Ruby轻松生成它,而无需任何SVG库,并可以在任何现代Web浏览器中查看。这是一个示例:通过字符串插值的SVG点points=(0..5).map{[rand(100)-50,rand(100)-50]}puts#{points.map{|x,y|""}.join("\n")}ENDSVG输出:http:/
这让我发疯。我向Gemfile添加了一个gem(hirb),但现在无法部署。是的,我使用了bundleinstall--pathvendor/cache是的,我使用了bundlepackage是的,我提交了Gemfile和Gemfile.lock我删除了生产机器中的vendor/cache文件夹,这样它会再次生成它而不是更新它。这是错误的吗?每当我运行cap:deploy时,我都会得到以下...executing"cd/var/www/releases/20120606002321&&bundleinstall--gemfile/var/www/releases/20120606002
我只是想学习编写example-output-plugin,请关注此页面:http://www.elastic.co/guide/en/logstash/current/_how_to_write_a_logstash_output_plugin.html#_clone_and_test_4当我在文件夹~/logstash-output-example中键入“bundleinstall”时,出现错误:无法在任何gem源中找到gem'logstash-devutils(>=0)ruby'列在您的Gemfile中或安装在native上。似乎错过了gem'logstash-devutil
我第一次尝试运行capdeploy但出现此错误...[11.12.13.140]sh-c'cd/var/www/releases/20120302151641&&bundleinstall--gemfile/var/www/releases/20120302151641/Gemfile--path/var/www/shared/bundle--deployment--quiet--withoutdevelopmenttest'**[out::11.12.13.140]Somegemsseemtobemissingfromyourvendor/cachedirectory.**[out:
本周六(12月27日),我将项目Rails版本从4.1.5升级到4.2.0。而且我还将Ruby版本从2.1.2升级到2.1.5。今天,我试图运行Controller生成器:bin/railsgcontrollerClientsindex,我意识到该命令不起作用。我收到此错误:Couldnotfindi18n-0.7.0inanyofthesources我尝试了其他命令,例如:bin/rakedb:migrate、bin/rake和同样的问题。但我可以使用以下命令运行服务器:bin/railss。我也可以浏览网站。 最佳答案 我解决了
我最近一直在尝试在服务器上运行我的ruby应用程序,但我一直遇到这个错误:Couldnotfindrake-10.0.4inanyofthesources(Bundler::GemNotFound)我正在运行Rails3.2.12和Ruby1.9.3p392。到目前为止,我在访问服务器时没有遇到任何问题,这是我第一次遇到这种错误。我曾尝试四处寻找答案,但由于我对ruby和rails还比较陌生,所以找不到简单易懂的答案。gem文件:source'http://rubygems.org'#STANDARDSETOFGEMS,SEEBOTTOMOFFILEFORALISTOFOTHE
我觉得很有趣,当我搜索与ruby相关的内容时,所有与rubyonrails相关的结果都会弹出。所以没有人再使用原始ruby了吗?但是,我是ruby新手。今天早上我只是想在网络服务器上运行一个简单的helloworldruby脚本,首先是apache2,然后尝试了mongrel。但不幸的是我失败了。我用谷歌搜索了所有可能的方法,但结果只显示了关于rubyonrails的信息。那么真的有什么方法可以在任何Web服务器上运行ruby脚本,或者即使我只想做一个helloworld应用程序,我也必须使用ror? 最佳答案