代码之家  ›  专栏  ›  技术社区  ›  Scaraux

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

  •  0
  • Scaraux  · 技术社区  · 5 年前

    目的是展示一个 Dialog 在等待 Stream 为了释放一个值,我构建了一个简单的实用函数。

    这个函数需要一段时间 (广播) stream ,并将显示加载 对话 直到发出第一个值。然后订阅被取消,对话框将自动关闭,这样我就不用担心了。

      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 与其参考上下文,不如随意提出建议。

    0 回复  |  直到 5 年前
        1
  •  0
  •   Yadu    5 年前

    我会走这条路,

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

    或 使用

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

    如果无法使用现有导航器弹出