是否有一种方法可以在特定页面上禁用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秒钟,否则我不希望用户有任何办法离开屏幕。(我正在尝试为幼儿编写一个应用程序,希望只有父母能够导航出特定的屏幕)。


当前回答

对于那些想要快速退出的人:

Navigator.popAndPushNamed(context, '/your_page_route');

其他回答

WillPopScope是一个很好的解决方案,onWillPop: () async => false返回按钮被禁用,但图标仍然在那里。

要删除和禁用后退按钮,只需使用AppBar中的leading: Container()。

答案是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(),
        ),
      ),
    ),
  );
}

使用生成的路由,您可以通过这样做返回到目标页面-

AppBar(
        leading: new IconButton(
        icon: new Icon(Icons.arrow_back),
         onPressed: () {
         Navigator.of(context) .pushNamedAndRemoveUntil(AppRouter.dashboard, (route) => false);
         }),
       )

正如Rémi Rousselet所指出的,WillPopScope通常是可行的方法。然而,如果你正在开发一个有状态的小部件,它应该直接对后退按钮做出反应,你可以使用这个:

https://pub.dartlang.org/packages/back_button_interceptor

注意:我是这个包的作者。

虽然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),
          ),
        ],
      ),
    ),
  );
}