flutter 如何获取Navigator堆栈中的路线数

flseospp  于 2022-12-24  发布在  Flutter
关注(0)|答案(4)|浏览(283)

是否有办法知道当前页面是否是Navigator Stack中的最后一个页面,并且此时调用Navigator.pop()将关闭应用程序?

zfciruhq

zfciruhq1#

您可以使用此代码检查路线是否为第一条:

ModalRoute.of(context).isFirst

所以完整的代码是

if(! ModalRoute.of(context).isFirst)
Navigator.pop();
uwopmtnx

uwopmtnx2#

它没有关闭应用程序,它破坏了最后一条路线,显示黑屏。
您可以使用以下命令关闭应用程序:Flutter how to programmatically exit the app
并且您无法访问堆栈或历史记录,因为它在Navigator类Navigator._history中是私有的,但您可以使用此解决方案来检查当前路线是否是最后一条路线:

Future<bool> isCurrentRouteFirst(BuildContext context) {
    var completer = new Completer<bool>();
    Navigator.popUntil(context, (route) {
      completer.complete(route.isFirst);
      return true;
    });
    return completer.future;
  }
brc7rcf0

brc7rcf03#

如果你只是想在应用程序退出之前处理一些事情,比如显示一个确认对话框,你可以使用WillPopScope
示例

@override
  Widget build(BuildContext context) {
    return WillPopScope(
      onWillPop: _showDialog,
      child: Scaffold(
        body: Center(
          child: Text("This is the first page"),
        ),
      ),
    );
  }

  Future<bool> _showDialog() {
    return showDialog(
      context: context,
      builder: (context) {
      return AlertDialog(
        title: Text("Are you sure?"),
        content: Text("You want to exit app"),
        actions: <Widget>[
          FlatButton(
            child: Text("Yes"),
            onPressed: () => Navigator.of(context).pop(true),
          ),
          FlatButton(
            child: Text("No"),
            onPressed: () => Navigator.of(context).pop(false),
          )
        ],
      );
    }) ?? false;
  }
0mkxixxg

0mkxixxg4#

我在AppBar小部件的源代码中找到了这个。

final ModalRoute<dynamic>? parentRoute = ModalRoute.of(context);
final bool canPop = parentRoute?.canPop ?? false;

canPopfalse时,您位于根屏幕。

相关问题