flutter - Flutter - StreamBuilder 构建器功能在导航器弹出时运行
问题描述
我有一个名为的小部件RootContainer
,它接收 aWidget child
并将其包装在 a 中StreamBuilder
:
class RootContainer extends StatelessWidget {
final Widget child;
RootContainer({this.child});
@override
Widget build(BuildContext context) {
return StreamBuilder<OverlayAlert>(
stream: ApiService.ThrottledException.stream,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.active) {
Future.delayed(Duration.zero, () => showAlert(context, snapshot));
}
return this.child;
},
);
}
void showAlert(BuildContext context, snapshot) {
print("showing dialog");
showDialog(
context: context,
builder: (context) => OverlayAlertDialog(snapshot),
);
}
发生错误时,我向ApiService.exception.stream
触发 StreamBuilder 构建器的流添加一个新值,然后它会打开一个对话框。
这是当前的小部件树:
当我想弹出导航器时,问题就开始了,StreamBuilder.builder
再次构建!
我认为这可能会发生,因为
RootContainer
正在重建,但是在它print
之前放置一个StreamBuilder
只会导致一个打印。我尝试
.listen
了流,当我弹出导航器时流没有触发,所以我可以确认ApiService.ThrottledException.stream
.弹出导航器时的快照等于(数据)最后一次发射。
您可以在以下演示中看到,每当我按下后退按钮时,对话框都会再次弹出:
StreamBuilder
当我按下后退按钮时,什么可能导致重建自身?
解决方案
我不得不更改RootContainer
为扩展StatefulWidget
而不是StatelessWidget
.
我不知道幕后发生了什么,但它有效!任何解释都会很好。
推荐阅读
- node.js - NodeJS在登录后重定向用户时在url中发送一个令牌
- javascript - 无法使用 chrome-cookies-secure 模块解析 Node.js 应用程序中的 Promise
- docker - 如何从容器内的 error.log 中检索输出?
- java - 将对象从一个窗口传递到现有窗口
- c# - 将文本从一个文件复制到另一个文件会导致路径被拒绝异常
- excel - Range 类的粘贴特殊方法仅有时会失败
- c# - C# StreamReader 与 NetworkStream 挂起
- android - 如何在所有可能的共享意图中显示我的应用程序并接收它们?
- javascript - 在javascript中的回调函数中打印新行
- javascript - 反应 setState 不更新