是否有一种方法可以在特定页面上禁用Android后退按钮?
class WakeUpApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: "Time To Wake Up ?",
home: new WakeUpHome(),
routes: <String, WidgetBuilder>{
'/pageOne': (BuildContext context) => new pageOne(),
'/pageTwo': (BuildContext context) => new pageTwo(),
},
);
}
}
在第一页,我有一个按钮去第二页:
new FloatingActionButton(
onPressed: () {
Navigator.of(context).pushNamed('/pageTwo');
},
)
我的问题是,如果我按下android屏幕底部的后退箭头,我就会回到pageOne。我想这个按钮不显示在所有。
理想情况下,除非用户的手指持续按在屏幕上5秒钟,否则我不希望用户有任何办法离开屏幕。(我正在尝试为幼儿编写一个应用程序,希望只有父母能够导航出特定的屏幕)。
答案也许你知道使用WillPopScope,但不幸的是,在IOS上你不能滑动回上一页,所以让我们自定义你的MaterialPageRoute:
class CustomMaterialPageRoute<T> extends MaterialPageRoute<T> {
@protected
bool get hasScopedWillPopCallback {
return false;
}
CustomMaterialPageRoute({
@required WidgetBuilder builder,
RouteSettings settings,
bool maintainState = true,
bool fullscreenDialog = false,
}) : super(
builder: builder,
settings: settings,
maintainState: maintainState,
fullscreenDialog: fullscreenDialog,
);
}
现在你可以使用WillPopScope并向后滑动在IOS上工作。详细答案在这里:https://github.com/flutter/flutter/issues/14203#issuecomment-540663717
虽然Remi的回答是正确的,但通常情况下,您不希望简单地阻止返回按钮,而是希望用户确认退出。
你可以用类似的方式从确认对话框中获取答案,因为onWillPop是一个未来。
@override
Widget build(BuildContext context) {
return WillPopScope(
child: Scaffold(...),
onWillPop: () => showDialog<bool>(
context: context,
builder: (c) => AlertDialog(
title: Text('Warning'),
content: Text('Do you really want to exit'),
actions: [
FlatButton(
child: Text('Yes'),
onPressed: () => Navigator.pop(c, true),
),
FlatButton(
child: Text('No'),
onPressed: () => Navigator.pop(c, false),
),
],
),
),
);
}
尝试这将杀死你的应用程序状态
@override
Widget build(BuildContext context) {
return WillPopScope(
////////////////
onWillPop: () => showDialog<bool>(
context: context,
builder: (c) => AlertDialog(
title: Text(
'Warning',
textAlign: TextAlign.center,
),
content: Text('Are you sure to exit?'),
actions: [
TextButton(
style: TextButton.styleFrom(
primary: Colors.green,
),
onPressed: () async {
exit(0);// kill app
},
child: Text('Yes'),
),
TextButton(
style: TextButton.styleFrom(
primary: Colors.red,
),
onPressed: () => Navigator.pop(c, false),
child: Text('No'),
)
],
),
),
/////////////////////
child: Scaffold(),
);
}