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

ron*_*nbm 5 flutter flutter-bloc

下面是代码。

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

登录页面内:

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... }
Run Code Online (Sandbox Code Playgroud)

当状态为 时UserAuthorized,我想弹出对话框以及LoginPage,以便返回到最后一页,即主页。但是,使用上面的代码,有时它可以工作,但有时也会弹出主页。我试过,有/没有 rootNavigator 设置为 true,但无法实现我的目标。

请帮助我了解我在这里缺少什么。

我已经在这里检查了答案如何关闭颤振对话框? .

Tip*_*tan 8

你可以简单地使用

Navigator.popUntil(context, (route) {
            return count++ == 2;
          });
Run Code Online (Sandbox Code Playgroud)

更新:

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

Navigator.push(context, MaterialPageRoute(builder: (context)=>YourMaterialClassName(), settings: RouteSettings(name: "nameOfYourClass")));
Run Code Online (Sandbox Code Playgroud)

当你提升你的材料等级时。

然后在弹出使用的时候

Navigator.popUntil(context, (route) => route.settings.name == "nameOfYourClass");
Run Code Online (Sandbox Code Playgroud)