Flutter:使用 PopupMenuButton 的选择功能导航到另一个页面

aha*_*ddy 2 dart flutter

我试图从应用程序主页上 PopupMenuButton 列表上的“注销”按钮导航回登录页面。我尝试配置的“注销”按钮如下所示:

在此输入图像描述

简化的代码如下所示:

@override
Widget build(BuildContext context) {
return Scaffold(
    appBar: AppBar(
      title: Text('Home Page'),
      actions: <Widget>[
        PopupMenuButton<String>(
          onSelected: choiceAction,
          itemBuilder: (BuildContext context) {
            return MenuOptions.choices.map((String choice){
              return PopupMenuItem<String>(
                value: choice,
                child: Text(choice),
              );
            }).toList();
Run Code Online (Sandbox Code Playgroud)

onSelected调用以下内容choiceAction

  void choiceAction(String choice) {
    setState() {
      if (choice == MenuOptions.SignOut) {
        Navigator.push(
          context,
          MaterialPageRoute(builder: (context) => LoginPage()),
        );
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

我面临的问题是它context在 Navigator.push 中说未定义。我不确定我是否使用Widget build(BuildContext context)or中定义的上下文itemBuilder: (BuildContext context),并且我不知道如何修复其未定义的错误以使其使用在 中调用的定义onSelected

Jaf*_*afi 6

您还必须将上下文发送到您的函数。您唯一需要做的就是这样:

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
  title: Text('Home Page'),
  actions: <Widget>[
    PopupMenuButton<String>(
      onSelected: (choice) => choiceAction(choice, context),
      itemBuilder: (BuildContext context) {
        return MenuOptions.choices.map((String choice){
          return PopupMenuItem<String>(
            value: choice,
            child: Text(choice),
          );
        }).toList();
Run Code Online (Sandbox Code Playgroud)

你选择的动作函数应该是这样的:

void choiceAction(String choice, BuildContext context) {
setState() {
  if (choice == MenuOptions.SignOut) {
    Navigator.push(
      context,
      MaterialPageRoute(builder: (context) => LoginPage()),
    );
    }
  }
}
Run Code Online (Sandbox Code Playgroud)