Flutter:如何弹出对话框和当前页面?
Flutter: How do I pop dialog as well as current page?
下面是代码。
- 从主页导航到登录页面
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");
下面是代码。
- 从主页导航到登录页面
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");