如何在颤动中拦截AppBar中的后退按钮
Posted
技术标签:
【中文标题】如何在颤动中拦截AppBar中的后退按钮【英文标题】:How to intercept back button in AppBar in flutter 【发布时间】:2019-07-25 02:25:47 【问题描述】:当第1页从第2页返回时,我正在使用拦截器https://pub.dartlang.org/packages/back_button_interceptor执行一个方法。
如果我使用设备返回按钮从第 2 页返回到第 1 页,则执行该方法。
但如果我使用 appBar 上的箭头按钮从第 2 页返回到第 1 页,我将无法执行该方法。
后退箭头按钮功能如何默认为设备后退按钮?
【问题讨论】:
***.com/questions/45916658/…的可能重复 How to deactivate or override the android "BACK" button, in Flutter?的可能重复 【参考方案1】:AppBar
中的默认后退按钮是来自material.dart
的BackButton
小部件。你可以手动创建它并传递你自己的onPressed
来做你想做的事:
return Scaffold(
appBar: AppBar(
leading: BackButton(onPressed: _onBackPressed),
title: Text('Title'),
),
body: Container(),
);
如果您没有在AppBar
中指定leading
,那么它会使用执行Navigator.maybePop(context)
的处理程序创建一个BackButton
。
【讨论】:
【参考方案2】:您可以在 Page 2 上用 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(),
),
),
),
);
this post的答案代码
编辑:添加到第 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.
【讨论】:
感谢您的调查,这不会改变任何事情,我想再次提一下,当页面从第 2 页返回时,我在第 1 页使用拦截器来调用方法。该方法调用正在使用设备后退按钮。但是当我使用 AppBar 上的后退按钮从第 2 页返回到第 1 页时,不会调用该方法。 @ningomba2.0 我不知道您是否正确阅读了答案。你用你自己的按钮替换appBar中的后退按钮然后你可以在那里调用你想要的东西? onPressed 回调是否在您的领先小部件中触发? 没错,我像上面提到的那样使用领先的属性替换它。回调正在触发。 @ningomba2.0 那么答案是否正确?您可以从那里调用您想要调用的相同方法并按照您在第一个场景中提到的那样处理它 我会尝试上传文件,我想我无法解释清楚。我在第 1 页而不是在第 2 页使用拦截器。我提到当它从第 2 页返回时,我想在第 1 页执行一个函数。以上是关于如何在颤动中拦截AppBar中的后退按钮的主要内容,如果未能解决你的问题,请参考以下文章
如何在flutter中停用或覆盖appBar中的箭头后退按钮?