Flutter Navigation push()和pop(),填满了堆栈?

时间:2018-08-31 08:35:50

标签: dart flutter

在Flutter中构建应用程序,我想使用导航抽屉并添加一些FlatButtons。 每个08-31 13:36:19.018 13207-13207/com.knowyourmeds E/com.facebook.internal.AttributionIdentifiers: getAttributionIdentifiers should not be called from the main thread 都有一个FlatButton方法,在这里我onPressed()移到所需的页面,效果很好。

我想知道随着时间的推移这是否会填满内存,因为我一直在推动但从未从堆栈中弹出页面。 总是将Navigator.push()Navigator.pop()依次相结合似乎有点奇怪,而且与良好实践相距甚远。

也许有人可以启发我正确的做事方法。

3 个答案:

答案 0 :(得分:2)

这确实会导致潜在的内存问题。要解决此问题,您可以弹出不需要的路由。您还可以添加自定义NavigatorObserver来添加历史记录限制。

示例:

class HistoryLimit extends NavigatorObserver {
  final int limit;
  final history = <Route>[];

  HistoryLimit([this.limit = 42]);


  @override
  void didReplace({Route<dynamic> newRoute, Route<dynamic> oldRoute}) {
    final index = history.indexOf(oldRoute);
    history[index] = newRoute;
  }


  @override
  void didPush(Route route, Route previousRoute) {
    history.add(route);
    if (history.length >= limit) {
      this.navigator.removeRoute(history.first);
    }
  }

  @override
  void didPop(Route route, Route previousRoute) {
    history.remove(route);
  }

  @override
  void didRemove(Route route, Route previousRoute) {
    history.remove(route);
  }
}

您通过在此处添加来使用它:

MaterialApp(
  navigatorObservers: [
   HistoryLimit(10) 
  ],
  ...
)

答案 1 :(得分:1)

当您希望后退按钮导航到上一条路线时,请使用Navigator.pop()。在这种情况下,是的,堆栈不断填满。

还有其他类似的方法

,用新路径替换当前路径。 这样,您将无法使用Android的“后退”按钮在上一条路线中向后导航。

答案 2 :(得分:1)

你试过了吗

Navigator
        .of(context)
        .pushReplacement(...

?