V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
murmurkerman
V2EX  ›  Flutter

Flutter GoRouter 如何实现 SingleTop

  •  
  •   murmurkerman · 1 天前 · 147 次点击

    有些页面需要保持单例,比如:历史 -> 详情 -> 历史-> 详情,在返回的时候需要多次返回历史页面和详情页面,期望的场景是历史页面和详情页面都是单例,假如一个用户的路径是:

    1. 主页 -> 历史 -> 详情 -> 历史,那么路由栈应该是 主页 -> 历史。
    2. 主页 -> 历史 -> 详情 -> 历史 -> 详情,那么路由栈应该是 主页 -> 历史 -> 详情

    替换 Router 实现,比如 AutoRoute 不太现实,有太多页面了,测试工作量很大。

    GoRouter 本身只支持push, pushReplacement, go, replace, pop

      RouteMatchList _updateRouteMatchList(
        RouteMatchList newMatchList, {
        required RouteMatchList? baseRouteMatchList,
        required Completer<Object?>? completer,
        required NavigatingType type,
      }) {
        switch (type) {
          case NavigatingType.push:
            return baseRouteMatchList!.push(
              ImperativeRouteMatch(
                pageKey: _getUniqueValueKey(),
                completer: completer!,
                matches: newMatchList,
              ),
            );
          case NavigatingType.pushReplacement:
            final RouteMatch routeMatch = baseRouteMatchList!.last;
            return baseRouteMatchList.remove(routeMatch).push(
                  ImperativeRouteMatch(
                    pageKey: _getUniqueValueKey(),
                    completer: completer!,
                    matches: newMatchList,
                  ),
                );
          case NavigatingType.replace:
            final RouteMatch routeMatch = baseRouteMatchList!.last;
            return baseRouteMatchList.remove(routeMatch).push(
                  ImperativeRouteMatch(
                    pageKey: routeMatch.pageKey,
                    completer: completer!,
                    matches: newMatchList,
                  ),
                );
          case NavigatingType.go:
            return newMatchList;
          case NavigatingType.restore:
            // Still need to consider redirection.
            return baseRouteMatchList!.uri.toString() != newMatchList.uri.toString()
                ? newMatchList
                : baseRouteMatchList;
        }
      }
    
    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5007 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 05:40 · PVG 13:40 · LAX 21:40 · JFK 00:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.