Flutter:确定对话框何时成功呈现



为了在等待Stream发出值的同时显示加载的Dialog,我构建了一个简单的实用程序函数。

该函数采用(广播(stream,并将显示加载Dialog,直到发出第一个值。然后订阅被取消,对话框将自行关闭,所以我不必担心。

static void wrapStreamWithLoadingModal(BuildContext context, {@required Stream stream}) {
BuildContext dialogContext;
StreamSubscription subscription;
subscription = stream.listen((_) {
subscription.cancel();
if (dialogContext != null) {
Navigator.pop(dialogContext);
}
}, onError: (error) {
subscription.cancel();
if (dialogContext != null) {
Navigator.pop(dialogContext);
}
});
showCupertinoDialog(
context: context,
builder: (BuildContext dContext) {
dialogContext = dContext;
return Center(
child: Container(
decoration:
BoxDecoration(borderRadius: BorderRadius.circular(5.0), color: Colors.white),
padding: EdgeInsets.all(10.0),
width: 120.0,
height: 100.0,
child: Column(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
new Text('Loading...'),
new CircularProgressIndicator(),
],
),
),
);
},
);
}

这非常好,除了一种情况:如果流在绘制对话框时发出,这意味着它还没有出现在屏幕上,那么我对其BuildContext的引用为空,我不能忽略任何内容。

如何知道对话框何时成功显示?还是防止这种边缘情况?此外,也许我应该使用一些key,而不是引用上下文,请随意建议。

我会走这条路,

showMyDialog();
//insert some delay here
await stream.first
pop();
showMyDialog(){
showCupertinoDialog(//...
}

或使用

Navigator.of(context, rootNavigator: true).pop();

如果您无法弹出现有的Navigator

最新更新