【问题标题】:perform a navigation inside the build method of a widget? - flutter在小部件的构建方法中执行导航? - 颤动
【发布时间】:2020-05-29 11:34:45
【问题描述】:

快速提问:如何在小部件的 build 方法中执行导航?

  • 我正在开发一个 Flutter 应用。
  • 我使用 Bloc 架构。

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

为了显示作业状态,我在块中使用了 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); 因为在构建期间不允许导航。

如何进行此导航?

我当前的 dirty 解决方案是使用以下函数,但它很难看:

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

【问题讨论】:

  • 您回答了自己的问题。您无法在构建期间导航。我想说使用StreamBuilder 可能不是你想要的,因为 UI 实际上并不直接依赖于流的结果。
  • 那怎么办?根据流的值,它可能需要重建或导航。
  • 那怎么办?根据流的值,它可能需要重建或导航。 @Anion47

标签: flutter dart flutter-navigation


【解决方案1】:

你可以用这行代码添加一个在构建方法完成后执行的回调:

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

【讨论】:

    【解决方案2】:

    '因为在构建过程中不允许导航。'话虽如此,您应该考虑创建一个单独的函数,该函数将接收作为输入的内容,您将考虑是否弹出该屏幕。

    【讨论】:

      猜你喜欢
      • 2020-05-05
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-19
      • 1970-01-01
      • 2011-12-20
      • 2021-11-25
      相关资源
      最近更新 更多