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;
// }
}