在Flutter中向多个小部件广播数据

6
有没有一种方法可以将数据从一个小部件广播到其他小部件?类似于Android上的BroadcastReceiver或iOS上的NSNotificationCenter。
具体来说,我正在尝试检测Navigator何时弹出或推送新视图。我向MaterialApp添加了navigatorObservers。当小部件回到前台时,我希望能够通过从didPush和didPop中广播当前前景中实际路线的更改来通知它。

有很多方法可以做到这一点,但是你能解释一下为什么你想被通知这些变化吗?你想通过这样做实现什么目标? - Collin Jackson
或许Flutter的操作方式不同,但在我的情况下,当用户看到登录页面时,他会按下登录按钮并完成登录流程。一旦完成,我便关闭登录流程并显示登录页面。如果我们现在拥有有效的访问令牌,我会关闭登录页面并将其替换为内容页面。通常,在Android中,我会在onResume或者onActivityResult中实现这个功能。但是我找不到Flutter中类似的东西。唯一能想到的就是检测Navigator弹出或推送视图的时候,并查看哪个视图路由在前台。 - user3217522
1个回答

17

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

onPressed: () async {
  bool isLoggedIn = await Navigator.pushNamed(context, '/login');
  if (isLoggedIn) {
    // do something
  }
}
当您的登录页面调用 Navigator.pop(true) 时,Future 将完成,并返回一个值为 true 的结果,该结果将分配给 isLoggedIn 变量(如果用户使用返回按钮返回上一页,则会得到 null)。

这也是 showDialog 的工作原理。


啊,有趣。我没有考虑到那个问题。谢谢! - user3217522
这也可以通过 Navigator.pop(context, true) 来实现,以关闭对话框并返回 true。 - Denn
未进入if代码块 - Yash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接