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

Flutter:如何在导航操作时为Widget添加动画效果?

基于导航操作为Flutter Widget添加动画的场景处理

在Widget首次创建时,我们可以在initState中调用animationController.forward()来触发初始动画。针对其他导航场景,处理方式如下:

1. 同一路由弹出(same route pop)

当当前路由被弹出(比如用户按返回键、调用Navigator.pop(context)),需要触发反向动画后再完成路由弹出。可以用WillPopScope组件监听返回事件:

@override
Widget build(BuildContext context) {
  return WillPopScope(
    onWillPop: () async {
      await _animationController.reverse();
      return true; // 允许路由弹出
    },
    child: YourAnimatedWidget(),
  );
}

如果是手动调用Navigator.pop,也可以先执行动画再弹出,确保动画完整执行。

2. 新路由推入(new route push)

推入新路由时,当前页面的Widget若需要执行退出动画(如淡出、收缩),可以在触发导航前手动启动动画,等待动画完成后再推入路由:

// 启动当前页面的退出动画
_animationController.reverse();
// 等待动画结束后跳转
await Future.delayed(_animationController.duration!);
Navigator.push(context, MaterialPageRoute(builder: (_) => NewTargetRoute()));

也可以自定义NavigatorObserver,在didPush回调中通知当前页面的Widget执行动画,这种方式更适合全局统一处理。

3. 新路由弹出(new route pop)

当新路由被弹出、回到当前页面时,需要触发恢复动画。可以利用Navigator.push的then回调,在路由返回时启动动画:

Navigator.push(context, MaterialPageRoute(builder: (_) => NewTargetRoute()))
  .then((_) {
    // 新路由关闭后,播放当前页面的恢复动画
    _animationController.forward();
  });

另外,也可以通过RouteAware和RouteObserver监听页面激活状态:给Widget混入RouteAware,在didPopNext方法中调用_animationController.forward(),这种方式能更精准地响应路由切换事件。

内容的提问来源于stack exchange,提问作者Sina Seirafi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 12:21:03