我正在尝试从位于应用程序主页上的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();
和onSelected
调用以下choiceAction
:
void choiceAction(String choice) {
setState() {
if (choice == MenuOptions.SignOut) {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => LoginPage()),
);
}
}
}
我面临的问题是它在Navigator.push中说context
是未定义的。我不确定是否使用Widget build(BuildContext context)
或itemBuilder: (BuildContext context)
中定义的上下文,但我不知道如何解决其未定义的错误,以使其使用{{ 1}}。
答案 0 :(得分:0)
您也必须将上下文发送到您的函数。您唯一需要做的就是这样:
@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();
和您的选择操作函数应如下所示:
void choiceAction(String choice, BuildContext context) {
setState() {
if (choice == MenuOptions.SignOut) {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => LoginPage()),
);
}
}
}