Flutter:如何弹出对话框和当前页面?

Flutter: How do I pop dialog as well as current page?

下面是代码。

  1. 从主页导航到登录页面
    ElevatedButton(
              onPressed: () => Navigator.of(context, rootNavigator: true)
                  .push(MaterialPageRoute(
                fullscreenDialog: true,
                builder: (context) => UserLoginPage(),
              )),
              child: Text('Login to continue'),
            ),

内部登录页面:

BlocConsumer<UserAuthCubit, UserAuthState>(
            listener: (context, state) {
              if (state is UserAuthorized) {
                Navigator.of(context, rootNavigator: true).pop();
              }
              if (state is UserAuthWaiting) {
                showModalBottomSheet(
                    useRootNavigator: true,
                    isDismissible: false,
                    context: context,
                    builder: (context) {
                      return WillPopScope(
                        onWillPop: () async => false,
                        child: Center(
                          child: Text(state.msg),
                        ),
                      );
                    });
                dialog = true;
              } else {
                if (dialog) {
                  Navigator.of(context, rootNavigator: true).pop();
                  dialog = false;
                }
              }
            },
            builder: (context, state) { // some widget code... }

当状态为 UserAuthorized 时,我想弹出对话框和登录页面,以便 return 到最后一页,即主页。然而,使用上面的代码,有时,它可以工作,有时,主页也会弹出。 我试过了,with/without rootNavigator 设置为true,但是无法实现我的objective.

请帮助我理解我在这里遗漏了什么。

我已经检查了这里的答案 如何关闭 flutter 对话框? .

我建议在对话后 return true,而不是使用 Navigator.of(context).pop()

或者您可以尝试使用

Navigator.of(context).pushReplacement(
  MaterialPageRoute(builder: (context) => HomePage()),
)

这样您就可以用 HomePage 替换 LoginPage。

您可以简单地使用

Navigator.popUntil(context, (route) {
            return count++ == 2;
          });

更新:

如果您不知道应该弹出多少页,那么您应该使用

Navigator.push(context, MaterialPageRoute(builder: (context)=>YourMaterialClassName(), settings: RouteSettings(name: "nameOfYourClass")));

当你推动你的 material class.

然后在弹出的时候使用

Navigator.popUntil(context, (route) => route.settings.name == "nameOfYourClass");