我试图从应用程序主页上 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。
您还必须将上下文发送到您的函数。您唯一需要做的就是这样:
@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)
| 归档时间: |
|
| 查看次数: |
3295 次 |
| 最近记录: |