尝试使用 Navigator.push() 导航到新屏幕,但它不起作用。 我创建了一个自定义类来显示 AlertDialog 并使用该对象调用该类来显示 AlertDialog
_customerAlertDialog.showConfirmAlertDialog(
context: context,
title: "Login In",
subTitle: "You need to login to purchase.",
onTapResponse: (bool val) async {
if (val) {
/// close AlertDialog
Navigator.of(context).pop();
Navigator.of(context).push(MaterialPageRoute(builder: (context) => LoginScreen()));
print("show the login screen");
} else {
//TODO : when user click no.
}
});
navigator.pop() 正在工作, 打印语句正在工作, 但 Navigator.push 不起作用。也尝试过这个:
Navigator.push(context,MaterialPageRoute(builder: (context) => LoginScreen()));
您在
context
中使用的 Navigator.of(context).pop()
对象不知道该对话框。
如果您的自定义警报对话框正在调用
showDialog
,请考虑传递 BuildContext
返回的 builder
对象:
showDialog(
context: context,
builder: (BuildContext ctx) {
// ctx is a context object that will be aware of the dialog
// consider passing this along to onTapResponse as an argument
},
);
然后您可以使用
BuildContext
来获取能够关闭对话框的导航器:
onTapResponse: (BuildContext ctx, bool val) async {
if (val) {
// close AlertDialog
Navigator.of(ctx).pop();
Navigator.of(ctx).push(MaterialPageRoute(builder: (context) => LoginScreen()));
print("show the login screen");
} else {
//TODO : when user click no.
}
}
因为
Navigator.of(context).pop();
改变上下文。
所以,在 pop() 之后,相同的上下文不起作用
Navigator.of(context).push
因此,要么只使用 Navigator.push(context).push,即不需要调用 pop,因为当移动到不同屏幕时,对话框会自动弹出
或者第二个选项是使用
Navigator.pop(context, [some boolean value here]);
就像用 pop 返回 true 一样。 并使用 pop 的值,条件是如果结果为 true,则推送到不同的屏幕。
示例:
var result = await _customerAlertDialog.showConfirmAlertDialog();
if(result) => Navigator.of(context).push();