有什么方法可以从Android后退按钮中捕获onBackPressed
事件吗?
我尝试了WillPopScope
但我的onWillPop
功能仅在我点击材料后退箭头按钮时触发
我这样说:
class MyView extends StatelessWidget{
Widget build(BuildContext context) {
return new WillPopScope(
onWillPop: () async {
debugPrint("Will pop");
return true;
},
child: ScopedModel<AppModel>(
model: new AppModel(),
child: new Scaffold(......
我需要抓住它,因为不知何故我的屏幕在按下后退按钮时表现不正确,它弹出屏幕和它下方的屏幕,但不知何故,使用材质后退箭头按钮工作正常。
更新
the code works, my problem was not in the pop of this screen, but on the previous screen, I use 2 MaterialApp widgets, and somehow it gave a weird behavior.
答案 0 :(得分:8)
为了防止导航WillPopScope是正确的方法,应按如下方式使用:
class Page2Route extends MaterialPageRoute {
Page2Route() : super(builder: (context) => new Page2());
}
class Page2 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new WillPopScope(
child: new Scaffold(
appBar: new AppBar(
title: new Text('Page 2'),
),
body: new Center(
child: new Text('PAGE 2'),
),
),
onWillPop: () {
return new Future(() => false);
},
);
}
}
可以像以下一样调用页面:
Navigator.of(context).push(new Page2Route());
请勿使用以下方法进行导航,因为它与最新的Flutter存在一些问题:
Navigator.push(context, new Page2Route());
答案 1 :(得分:1)
这就是我实施我的方法,对我来说很好。您可以尝试一下。
@override
Widget build(BuildContext context) {
return WillPopScope(
onWillPop: () {
_moveToSignInScreen(context);
},
child: Scaffold(
key: _scaffoldKey,
appBar: AppBar(
leading: IconButton(
icon: Icon(Icons.arrow_back),
onPressed: () {
_moveToSignInScreen(context);
}),
title: Text("Profile"),
),
),
);
}
void _moveToSignInScreen(BuildContext context) =>
Navigator.pushReplacementNamed(context, Routes.keySignIn);
答案 2 :(得分:0)
此代码适用于我。
我认为可能有两个原因。
onWillPop没有回复
return new WillPopScope(
onWillPop: () {
if (!_isOpened) Navigator.pop(context);
},
child: new Scaffold(
key: SharedService.orderScaffoldKey,
appBar: appBar,
body: new Builder(
builder: (BuildContext context) {
return page;
},
),
),
);
答案 3 :(得分:0)
另一种方法是实现NavigatorObserver
并将其链接到MaterialApp
:
https://api.flutter.dev/flutter/widgets/RouteObserver-class.html
您不必使用RouteAware
,也可以实现自己的NavigatorObserver
。
例如,这是Flutter分析如何自动跟踪屏幕打开/关闭的方式:
MaterialApp(
...
navigatorObservers: [
FirebaseAnalyticsObserver(analytics: analytics),
],
)
FirebaseAnalyticsObserver
扩展了本身实现RouteObserver
的{{1}}。
然而,NavigatorObserver
通常是更简单的解决方案
答案 4 :(得分:0)
在这里添加一个重要的点。
请注意,通过使用 WillPopScope
,我们将失去 iOS 上的向后滑动手势。