是否有一种方法可以在特定页面上禁用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秒钟,否则我不希望用户有任何办法离开屏幕。(我正在尝试为幼儿编写一个应用程序,希望只有父母能够导航出特定的屏幕)。
这里有一个替代的解决方案,如果你是用零安全编码。您需要禁用默认的后退按钮,并将其替换为IconButton。在本例中,当用户在退出前单击后退按钮确认时,我将按下AlertDialog。您可以替换此函数并将用户发送到任何其他页面
return WillPopScope(
onWillPop: () async => false,
child: Scaffold(
appBar: AppBar(
automaticallyImplyLeading: true,
title: Text(),
leading: IconButton(
icon: Icon(Icons.arrow_back),
onPressed: () => showDialog<bool>(
context: context,
builder: (c) => AlertDialog(
title: Text('Warning'),
content: Text('Are you sure you want to exit?'),
),
actions: [
TextButton(
child: Text('Yes'),
onPressed: () {
Navigator.pop(c, true);
Navigator.pop(context);
}),
TextButton(
child: Text('No'),
onPressed: () => Navigator.pop(c, false),
),
],
),
),
),
),
我把这个贴在这里,以防有人发现这个,并希望他们能找到一个简单的例子
https://gist.github.com/b-cancel/0ca372017a25f0c120b14dfca3591aa5
import 'package:flutter/material.dart';
import 'dart:async';
void main() => runApp(new BackButtonOverrideDemoWidget());
class BackButtonOverrideDemoWidget extends StatefulWidget{
@override
_BackButtonOverrideDemoWidgetState createState() => new _BackButtonOverrideDemoWidgetState();
}
class _BackButtonOverrideDemoWidgetState extends State<BackButtonOverrideDemoWidget> with WidgetsBindingObserver{
//-------------------------Test Variable
bool isBackButtonActivated = false;
//-------------------------Required For WidgetsBindingObserver
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
//-------------------------Function That Triggers when you hit the back key
@override
didPopRoute(){
bool override;
if(isBackButtonActivated)
override = false;
else
override = true;
return new Future<bool>.value(override);
}
//-------------------------Build Method
@override
Widget build(BuildContext context) {
return new Directionality(
textDirection: TextDirection.ltr,
child: new Container(
color: (isBackButtonActivated) ? Colors.green : Colors.red,
child: new Center(
child: new FlatButton(
color: Colors.white,
onPressed: () {
isBackButtonActivated = !isBackButtonActivated;
setState(() {});
},
child: (isBackButtonActivated) ?
new Text("DeActive the Back Button") : new Text("Activate the Back Button"),
)
)
),
);
}
}
答案是WillPopScope。它将防止页面被系统弹出。你仍然可以使用Navigator.of(context).pop()
@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(),
),
),
),
);
}
尝试这将杀死你的应用程序状态
@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(),
);
}