有没有办法限制Flutter应用程序中导航堆栈可以维护的页面数?

时间:2019-04-06 16:14:20

标签: dart flutter

在Flutter应用程序中,我发现导航堆栈不断增长。有没有一种方法可以限制导航堆栈中的内存页数(例如最多4页)?

在用户执行了一定数量的“后退”按钮触发器之后,还可以最小化/关闭Flutter应用程序吗?

1 个答案:

答案 0 :(得分:1)

我不知道有任何设置可用于设置此设置。因此,我将提出一种自己处理的方法。

以下两个变量是顶级,即,您可以将它们放在类之外的任何位置。另外,您可以使用InheritedWidget来存储数据,但是为了简单起见,我不会这样做。

int openedRoutes = 1, routePops = 0;

有两种方法可以捕获路线弹出消息。您只能捕获来自系统的内容,例如Android后退按钮,也可以接听您的Navigator弹出电话。您要记录的所有手动记录都必须使用Navigator.maybePop而不是Navigator.pop执行。

现在,您只需要将所有页面包装在以下小部件中即可使用WillPopScope来跟踪routePops

class TrackPops extends StatelessWidget {
  final Widget child;

  TrackPops({Key key, @required this.child}) : super(key: key);

  @override
  Widget build(BuildContext context) => 
      WillPopScope(child: child, onWillPop: () async {
            if (routePops++ >= backButtonLimit) /// [backButtonLimit] defined below
              SystemChannels.platform.invokeMethod('SystemNavigator.pop');
            openedRoutes--;
            return true;
          });
}

现在,您每次推入路线时都可以使用这两个变量。如前所述,InheritedWidget是惯用路径,您可以使用BuildContext.inheritFromWidgetOfExactType进行检索。

示例实现,其中路由限制为4,后退按钮按下次数为2

const int routeLimit = 4, backButtonLimit = 2;

void pushRoute(BuildContext context, Route route) {
  if (openedRoutes >= routeLimit) return;
  Navigator.of(context).push(route);
  openedRoutes++;
  routePops = 0;
}