草庐IT

Flutter 在任何 BuildContext 上绘制 Flushbar

coder 2023-07-23 原文

我使用 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 被关闭或动画化(或者至少它不是那么简单)。

相关问题:Flutter - Application Wide Notifications

最佳答案

尝试从根导航器显示您的 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) , 其中rootNavigatorfalse默认。使用它来获取“子根”导航器以显示新屏幕/页面。

例如放置另一个 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/

有关Flutter 在任何 BuildContext 上绘制 Flushbar的更多相关文章

  1. ruby - Capistrano 3 在任务中更改 ssh_options - 2

    我尝试使用不同的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

  2. ruby-on-rails - 在任何来源中都找不到 coffee-script-source-1.1.3 - 2

    您好,我正在做Rails应用程序,当我捆绑安装时它返回一个错误:无法在任何来源中找到coffee-script-source-1.1.3我知道coffee-script-source-1.1.3gem已被弃用/取消,但我的其他gem与此有依赖关系。但是这个项目正在与其他机器和heroku产品一起工作。如何在不更改我的gemfile的情况下成功捆绑安装?谢谢 最佳答案 运行这个:bundleupdate--sourcecoffee-script-source如果出现错误,如下所示:Anerroroccurredwhileinstall

  3. Flutter 环境变量配置和flutter doctor中的错误解决 - 2

    一、环境变量右键点击我的电脑-属性:然后找到环境变量 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      变量

  4. ruby - 在 Ruby 中绘制点和矩形 - 2

    我正在寻找一种简单的方法来绘制大约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:/

  5. ruby-on-rails - 如何解决 您的 vendor/cache 目录中似乎缺少一些 gems。无法在任何来源中找到 "whatever"? - 2

    这让我发疯。我向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

  6. ruby - 在任何 gem 源中都找不到 gem 'logstash-devutils (>= 0) ruby' - 2

    我只是想学习编写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

  7. ruby-on-rails - Rails 3. 无法在任何来源中找到 libv8-3.3.10.4 - 2

    我第一次尝试运行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:

  8. ruby-on-rails - 错误无法在任何来源中找到 i18n-0.7.0 - 2

    本周六(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。我也可以浏览网站。 最佳答案 我解决了

  9. ruby-on-rails - 在任何来源中都找不到 rake-10.0.4 (Bundler::GemNotFound) - 2

    我最近一直在尝试在服务器上运行我的ruby​​应用程序,但我一直遇到这个错误:Couldnotfindrake-10.0.4inanyofthesources(Bundler::GemNotFound)我正在运行Rails3.2.12和Ruby1.9.3p392。到目前为止,我在访问服务器时没有遇到任何问题,这是我第一次遇到这种错误。我曾尝试四处寻找答案,但由于我对ruby​​和rails还比较陌生,所以找不到简单易懂的答案。gem文件:source'http://rubygems.org'#STANDARDSETOFGEMS,SEEBOTTOMOFFILEFORALISTOFOTHE

  10. ruby - 如何在任何 Web 服务器(Apache 或 Mongrel 或其他任何东西)中运行简单的 ruby​​ 脚本 - 2

    我觉得很有趣,当我搜索与ruby​​相关的内容时,所有与ruby​​onrails相关的结果都会弹出。所以没有人再使用原始ruby了吗?但是,我是ruby​​新手。今天早上我只是想在网络服务器上运行一个简单的helloworldruby​​脚本,首先是apache2,然后尝试了mongrel。但不幸的是我失败了。我用谷歌搜索了所有可能的方法,但结果只显示了关于ruby​​onrails的信息。那么真的有什么方法可以在任何Web服务器上运行ruby​​脚本,或者即使我只想做一个helloworld应用程序,我也必须使用ror? 最佳答案

随机推荐