在我的Flutter App中,我注意到我的导航堆栈在不断增长。有没有办法限制导航堆栈中可以在内存中的页数(最多4页)?
在用户进行了一定数量的“后退”按钮触发后,是否可以最小化/关闭Flutter App?
我不知道任何允许您进行设置的设置。因此,我将提出一种自己处理它的方法。
以下两个变量是顶级变量,即您可以将它们放在类之外的任何位置。或者,您可以使用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;
}