首页 > 解决方案 > 在小部件的构建方法中执行导航?- 颤动

问题描述

快速问题:如何在小部件的构建方法中执行导航?

我有一个带有创建表单的屏幕。当用户按下按钮时,它会调用 REST api。在执行呼叫时,我会显示一个循环进度。当进度结束时,我希望弹出屏幕(使用导航)。

为了显示作业状态,我在 bloc 中使用 Stream,在小部件中使用 StreamBuilder。所以我想做这样的事情:

return StreamBuilder<Job<T>>(
    stream: jobstream,
    builder: (context, snapshot) {
      if (snapshot.hasData) {
        if (snapshot.data.jobStatus == JobStatus.progress)
          // job being executed, display progress
          return Center(child: CircularProgressIndicator());

        else if (snapshot.data.jobStatus == JobStatus.success)
          Navigator.pop(context); // Problem here!
          return Center(child: CircularProgressIndicator());
      } else {
          return DisplayForm();
      }
    });

我的行有问题: Navigator.pop(context); 因为在构建期间不允许导航。

我该怎么做这个导航?

我当前的肮脏解决方案是使用以下功能,但它很难看:

  static void deferredPop(BuildContext context) async{
    Future.delayed(
      Duration(milliseconds: 1),
        () => Navigator.pop(context)
     );
   }

标签: flutterdartflutter-navigation

解决方案


您可以使用这行代码添加要在构建方法完成后执行的回调:

WidgetsBinding.instance.addPostFrameCallback((_) => Navigator.pop(context));

推荐阅读