将数据广播到 Flutter 中的多个小部件

Posted

技术标签:

【中文标题】将数据广播到 Flutter 中的多个小部件【英文标题】:Broadcast data to multiple widgets in Flutter 【发布时间】:2017-11-08 10:36:04 【问题描述】:

有没有办法将数据从一个小部件广播到其他小部件?类似于 android 上的 BroadcastReceiver 或 ios 上的 NSNotificationCenter。

具体来说,我正在尝试检测导航器何时弹出或推送新视图。我将 navigatorObservers 添加到 MaterialApp。当一个小部件回到前台时,我希望能够通过广播来自 didPush 和 didPop 的更改以及当前前台中的实际路由来通知它

【问题讨论】:

有很多方法可以做到这一点,但您能否解释一下为什么您希望收到这些更改的通知?你这样做的目的是什么? 也许它在 Flutter 上的做法有所不同,但基本上,就我而言,当用户看到登录页面时,他会按下登录按钮并完成登录流程。完成后,我关闭登录流程并显示登录页面。如果我们现在有有效的访问令牌,我将关闭登录页面并将其替换为内容页面。通常,我会在 Android 的 onResume 或 onActivityResult 中完成此操作。但是我在 Flutter 上找不到类似的东西。我唯一能想到的就是检测 Navigator 何时弹出或推送视图,并查看哪个视图路由在前台。 【参考方案1】:

Navigator.push 返回一个Future,它会在调用Navigator.pop 时完成(并且这可以选择用于将数据传递回调用push 的小部件)。例如,假设您的登录按钮有这个onPressed 处理程序:

onPressed: () async 
  bool isLoggedIn = await Navigator.pushNamed(context, '/login');
  if (isLoggedIn) 
    // do something
  

当您的登录页面调用Navigator.pop(true) 时,Future 将以true 的值完成,该值将分配给isLoggedIn 变量。 (如果用户使用后退按钮返回上一屏幕,您将获得null。)

showDialog 也是这样工作的。

【讨论】:

啊有趣。我没有考虑到这一点。谢谢!! 这也可以通过Navigator.pop(context, true)来实现,让关闭的对话框返回true。

以上是关于将数据广播到 Flutter 中的多个小部件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 中对齐单个小部件?

Flutter -PDF -- 错误 - 这个小部件创建了 20 多个页面。这可能是小部件或文档中的问题

Flutter:导航时“小部件树中的多个全局键”

从 Flutter 中的 Stateful Widget 返回数据

使用 Dart 和 Flutter,我如何将动态小部件中的数据保存到另一个列表中的地图列表中

将数据从 Flutter Stream 传递到小部件