go_router学习

311 阅读1分钟

go_router

一个用于 Flutter 的声明式路由包,它使用 Router API 提供 方便的、基于 URL 的 API,用于在不同屏幕之间导航。您可以 定义 URL 模式、使用 URL 导航、处理深层链接以及许多 其他与导航相关的方案。

path query extra

class TestExtra {}

@TypedGoRoute<BreadcrumbsRoute>(path: '${RoutePath.breadcrumbs}/:fid')
class BreadcrumbsRoute extends GoRouteData {
  //path
  final String fid;

  //query
  final String pid;

  //额外的参数,固定的字段
  final TestExtra $extra;

  const BreadcrumbsRoute(this.fid, this.pid, this.$extra);
  
 // @override
 // Widget build(BuildContext context, GoRouterState state) => const TopPage();

  @override
  NoTransitionPage<void> buildPage(BuildContext context, GoRouterState state) =>
      NoTransitionPage<void>(
          child: BreadcrumbsPage(
        fid: fid,
        pid: pid,
        extra: $extra,
      ));
}


子路由

@TypedGoRoute<ArticleRoute>(
    path: RoutePath.article,
    routes: <TypedGoRoute<GoRouteData>>[
      TypedGoRoute<EditArticleRoute>(
        path: '${RouteName.editArticlePage}/:pathId',
      )
    ])
class ArticleRoute extends GoRouteData {
  const ArticleRoute();

  @override
  NoTransitionPage<void> buildPage(BuildContext context, GoRouterState state) =>
      const NoTransitionPage<void>(child: ArticlePage());
}

class EditArticleRoute extends GoRouteData {
  //path
  final int? id;
  final int? pathId;

  const EditArticleRoute({this.id, this.pathId});

  @override
  NoTransitionPage<void> buildPage(BuildContext context, GoRouterState state) =>
      NoTransitionPage<void>(
          child: EditArticlePage(
        id: id??1,
        pathId: pathId??1,
      ));
}

pushAndRemoveUntil popUntil


extension GoRouterX on GoRouter {
  Future<T?> pushAndRemoveUntilX<T extends Object?>(
      String location, String popUtil,
      {Object? extra}) {
    routerDelegate.navigatorKey.currentState
        ?.popUntil(ModalRoute.withName(popUtil));

    return push(location, extra: extra);
  }

  //
  void popUntil(String location) {
    routerDelegate.navigatorKey.currentState
        ?.popUntil(ModalRoute.withName(location));
  }

  void singTopPush(String location, {Object? extra}) {
    pushReplacement(location, extra: extra);
  }

// bool hasLocation(String location) {
//   return !goRouter.configuration.findMatch(location).isError;
// }
}