如何在Flutter中拦截AppBar中的返回按钮

17
我正在使用拦截器https://pub.dartlang.org/packages/back_button_interceptor在页面1从页面2返回时执行一个方法。
如果我使用设备的返回按钮从页面2返回到页面1,则该方法将被执行。
但是,如果我使用AppBar上的箭头按钮从页面2返回到页面1,则无法执行该方法。
如何使后退箭头按钮功能默认为设备返回按钮?

1
可能是 https://dev59.com/DVcO5IYBdhLWcg3wXwh3 的重复问题。 - Mazin Ibrahim
2
可能是如何在Flutter中停用或覆盖Android“返回”按钮?的重复问题。 - Marcos Boaventura
2个回答

44

在第二页中,您可以使用WillPopScope将脚手架包围起来,将onWillPop设置为false以防止系统弹出页面,然后将自己的返回按钮添加到应用栏的前导小部件中,并在其中执行弹出操作。

@override
Widget build(BuildContext context) {
  return new WillPopScope(
    onWillPop: () async => false,
    child: new Scaffold(
      appBar: new AppBar(
        title: new Text("data"),
        leading: new IconButton(
          icon: new Icon(Icons.ac_unit),
          onPressed: () => Navigator.of(context).pop(),
        ),
      ),
    ),
  );
}

此帖子的答案中提取的代码

编辑:添加页面2以控制导航

除了以上的代码,您还将在页面2中添加以下代码。 更改

Navigator.of(context).pop() 

Navigator.of(context).pop('upload_files')

然后在你的页面1中,当你导航时,你将等待导航并使用从页面2弹出的结果来运行你的逻辑

var navigationResult = await Navigator.push(
        context,
        new MaterialPageRoute(
            builder: (context) => Page2()));


 if(navigationResult == 'upload_files') {
    uploadFiles(); // Perform your custom functionality here.
 }

@ningomba2.0 我不确定你是否正确阅读了答案。你需要用自己的按钮替换AppBar中的返回按钮,然后就可以在其中调用你想要的内容了吗?你的leading widget中onPressed回调函数是否正常触发? - Filled Stacks
@ningomba2.0 那么答案就是正确的吗?你可以从那里调用想要调用的相同方法,并按照你在第一个场景中提到的方式处理它。 - Filled Stacks
我会尝试上传文件,但我觉得我无法清楚地解释。我在页面1中使用拦截器而不是页面2。我提到了当从页面2返回时,我想在页面1中执行一个函数。 - ningomba 2.0
@ningomba2.0 哦哦哦哦哦哦哦哦。那个答案非常不同。我现在会根据你的需求更新我的答案。 - Filled Stacks
栈正好能胜任这项任务,这正是我所需要的。非常感谢你的帮助。 - ningomba 2.0
显示剩余6条评论

10
AppBar 的默认返回按钮是来自 material.dart 中的 BackButton 小部件。您可以手动创建它,并传递您自己的 onPressed 来执行所需操作:
return Scaffold(
  appBar: AppBar(
    leading: BackButton(onPressed: _onBackPressed),
    title: Text('Title'),
  ),
  body: Container(),
);

如果在AppBar中没有指定leading,那么它会创建一个带有处理程序的BackButton,该处理程序执行Navigator.maybePop(context)操作。

1
比起被接受的答案要简单得多。谢谢。 - shawnlg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接