Flutter - StreamBuilder 构建器函数在导航器弹出时运行
Flutter - StreamBuilder builder function runs when navigator pops
我有一个名为 RootContainer
的小部件,它接收 Widget child
并将其包装在 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
正在重建,但是在 StreamBuilder
之前放置一个 print
结果只打印了一个。
我尝试 .listen
到流,当我弹出导航器时流没有触发,所以我可以确认 ApiService.ThrottledException.stream
没有问题。
弹出导航器时的快照等于(数据)上次发射。
你可以在下面的演示中看到,每当我按下后退按钮时,对话框再次弹出:
当我按下后退按钮时,什么会导致 StreamBuilder
自行重建?
我不得不更改 RootContainer
以扩展 StatefulWidget
而不是 StatelessWidget
。
我不知道幕后发生了什么,但它有效!任何解释都会很好。
我有一个名为 RootContainer
的小部件,它接收 Widget child
并将其包装在 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
正在重建,但是在StreamBuilder
之前放置一个print
结果只打印了一个。我尝试
.listen
到流,当我弹出导航器时流没有触发,所以我可以确认ApiService.ThrottledException.stream
没有问题。弹出导航器时的快照等于(数据)上次发射。
你可以在下面的演示中看到,每当我按下后退按钮时,对话框再次弹出:
当我按下后退按钮时,什么会导致 StreamBuilder
自行重建?
我不得不更改 RootContainer
以扩展 StatefulWidget
而不是 StatelessWidget
。
我不知道幕后发生了什么,但它有效!任何解释都会很好。