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

Flutter PageRoute/buildTransitions每帧重建问题排查求助

Flutter PageRoute buildTransitions 每帧重建问题排查

Flutter的可扩展PageRoute类(PageRouteBuilder也实现了该类)包含两个处理页面内容的核心方法:

  • buildPage:负责构建页面主内容
  • buildTransitions:负责将内容包裹在一个或多个过渡组件中

我遇到了页面过渡动画轻微卡顿、帧速率下降的问题,排查后发现buildPage符合预期,仅在必要时触发构建;但buildTransitions却和AnimatedBuilder的builder方法一样,每帧都会重建。根据文档描述,这并非预期行为——buildTransitions应该仅在Route状态发生变化时才重建。我已经禁用了所有自定义继承组件和Hero动画,但仍无法定位导致它每帧重建的原因。

附上测试代码:

class TestFadeRoute<T> extends PageRoute<T> {
  TestFadeRoute(TestFadePage<T> page);
  
  TestFadePage<T> get _page => settings as TestFadePage<T>;
  
  @override // 省略其他重写方法
  Widget buildPage(BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation) {
    print('buildPageDidBuild'); 
    // 调试信息:仅在必要时打印(如首次构建或ModalRoute修改时)

    return Semantics(
      scopesRoute: true,
      explicitChildNodes: true,
      child: _page.child,
    );
  }
  
  @override
  Widget buildTransitions(BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation, Widget child) {
    print('buildTransitionsDidBuild');
    // 调试信息:动画的每一帧都会打印

    return FadeTransition(
      opacity: animation,
      child: child,
    );
  }
}

假设这确实属于非预期行为,我有两个疑问:

  1. 哪些原因可能导致buildTransitions每帧重建?
  2. 是否有办法判断Route状态是否发生变化、以及变化的时机?

目前我找到的临时解决方法是忽略buildTransitions,在buildPage传入的组件中通过context获取ModalRoute来实现过渡,但如果这才是正确做法,那buildTransitions存在的意义是什么?


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 21:53:16