showdialog 内的 Navigator.push() 不起作用

问题描述 投票:0回答:2

尝试使用 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())); 
flutter dart flutter-layout
2个回答
1
投票

您在

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.
  }
}

0
投票

因为

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();
© www.soinside.com 2019 - 2024. All rights reserved.