You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在go_router中为.go方法设置动态页面过渡动画

动态修改GoRouter跳转时的过渡动画

要实现动态选择跳转动画,核心是利用GoRouter路由跳转时的extra参数传递动画配置,再在pageBuilder中根据这个参数动态切换过渡效果,具体实现如下:

1. 定义动画类型枚举(可选,更规范)

先定义一个枚举来标识不同的动画类型,避免字符串硬编码:

enum PageTransitionType {
  slideFromRight,
  slideFromLeft,
  slideFromTop,
  slideFromBottom,
  // 可根据需求扩展更多动画类型
}

2. 修改GoRouter的pageBuilder逻辑

在每个路由的pageBuilder中,读取state.extra传递的动画类型,默认保留原有动画作为兜底:

final router = GoRouter(
  initialLocation: '/inbox',
  routes: <GoRoute>[
    GoRoute(
      path: '/inbox',
      pageBuilder: (BuildContext context, GoRouterState state) {
        // 获取传递的动画类型,默认使用slideFromRight
        final transitionType = state.extra as PageTransitionType? ?? PageTransitionType.slideFromRight;
        
        switch(transitionType) {
          case PageTransitionType.slideFromLeft:
            return PageTransition.slideFromLeft(
              myChildWidget: Layout(
                context: context,
                state: state,
                child: EmailPage(),
              ),
              state: state,
            );
          case PageTransitionType.slideFromTop:
            return PageTransition.slideFromTop( // 假设你已实现该动画方法
              myChildWidget: Layout(
                context: context,
                state: state,
                child: EmailPage(),
              ),
              state: state,
            );
          default: // 默认使用slideFromRight
            return PageTransition.slideFromRight(
              myChildWidget: Layout(
                context: context,
                state: state,
                child: EmailPage(),
              ),
              state: state,
            );
        }
      },
    ),
    GoRoute(
      path: '/email/inbox/:id',
      pageBuilder: (BuildContext context, GoRouterState state) {
        final transitionType = state.extra as PageTransitionType? ?? PageTransitionType.slideFromLeft;
        
        switch(transitionType) {
          case PageTransitionType.slideFromRight:
            return PageTransition.slideFromRight(
              myChildWidget: Layout(
                context: context,
                state: state,
                child: const EmailDetailsPage(),
              ),
              state: state,
            );
          case PageTransitionType.slideFromBottom:
            return PageTransition.slideFromBottom( // 假设你已实现该动画方法
              myChildWidget: Layout(
                context: context,
                state: state,
                child: const EmailDetailsPage(),
              ),
              state: state,
            );
          default: // 默认使用slideFromLeft
            return PageTransition.slideFromLeft(
              myChildWidget: Layout(
                context: context,
                state: state,
                child: const EmailDetailsPage(),
              ),
              state: state,
            );
        }
      },
    ),
    GoRoute(
      path: '/menu',
      pageBuilder: (BuildContext context, GoRouterState state) {
        final transitionType = state.extra as PageTransitionType? ?? PageTransitionType.slideFromRight;
        
        switch(transitionType) {
          case PageTransitionType.slideFromLeft:
            return PageTransition.slideFromLeft(
              myChildWidget: Layout(
                context: context,
                state: state,
                child: const MenuPage(),
              ),
              state: state,
            );
          default:
            return PageTransition.slideFromRight(
              myChildWidget: Layout(
                context: context,
                state: state,
                child: const MenuPage(),
              ),
              state: state,
            );
        }
      },
    )
  ],
);

3. 动态指定动画跳转

调用go方法时,通过extra参数传递想要的动画类型:

// 使用slideFromLeft动画跳转到/inbox
GoRouter.of(context).go('/inbox', extra: PageTransitionType.slideFromLeft);

// 使用slideFromRight动画跳转到邮件详情页
GoRouter.of(context).go('/email/inbox/123', extra: PageTransitionType.slideFromRight);

// 不传递extra参数时,使用路由默认的动画
GoRouter.of(context).go('/menu');

补充说明

  • 若不想用枚举,也可直接传递字符串(如'slideFromLeft'),但枚举类型更安全,能避免拼写错误。
  • 如果你的PageTransition支持更多自定义配置(如动画时长、曲线),可以直接把完整的配置对象作为extra传递,灵活性更高。

内容的提问来源于stack exchange,提问作者Randal Andrade Nunes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 05:30:59