Flutter使用AnimatedPositioned出现UI卡顿,用AnimatedBuilder优化仍无效如何解决?
AnimatedPositioned动画卡顿修复方案
核心问题原因
- 动画逻辑冗余:同时混用
AnimatedBuilder显式动画监听、Obx响应式变量监听、AnimatedPositioned隐式动画三种更新逻辑,每帧会触发多次不必要的控件重建,抵消了child缓存的优化效果 - 监听粒度过大:外层
Obx同时监听trloaded和actionsBottom两个变量,动画过程中actionsBottom每帧更新都会触发整个包裹区域重建,你放在AnimatedBuilder的child缓存完全没有生效
修复方案
保留AnimatedPositioned隐式动画实现即可,删除冗余的AnimatedBuilder逻辑,拆分监听粒度,优化后代码如下:
// 提前缓存静态子控件,避免每次动画帧重复构建 final Widget actionButtons = Column( children: [ Row( mainAxisSize: MainAxisSize.min, children: [ GlobalButton( title: controller.trLanding('signUp'), type: ButtonType.outlinedPrimary, width: 154.w, height: 56, onTap: () => controller.goToSignUp(), ), SizedBox(width: 20.w), GlobalButton( borderWidth: 1, borderColor: AppColors.primary[800]!, title: controller.trLanding("signIn"), width: 154.w, height: 56, onTap: () => controller.goToSignIn()), ], ), Container( margin: const EdgeInsets.only(top: 16, bottom: 16), child: Row( children: [ Text( "By Signing up you agree with our ", style: textTheme.bodyText2!.copyWith( color: AppColors.neutral[400], ), ), GestureDetector( onTap: () { push(TermsPage()); }, child: Text( "Terms and Conditions", style: textTheme.bodyText2!.copyWith( color: AppColors.primary[700], ), ), ), ], ), ), ], ); // 构建层仅保留必要的隐式动画逻辑 Obx(() { return AnimatedPositioned( duration: const Duration(milliseconds: 1000), bottom: controller.actionsBottom, child: !controller.trloaded.value ? const SizedBox() : actionButtons, ); })
额外优化建议
- 如果
trloaded变量更新频率极低,可以把它的判断逻辑提到Obx外层,进一步缩小动画触发的重建范围 - 适配尺寸
154.w、20.w可提前在initState中计算完成并缓存,避免动画过程中重复执行适配计算 - 若需要使用显式动画实现效果,直接删除
AnimatedPositioned,在AnimatedBuilder中直接计算bottom参数即可,无需同时使用两种动画方案
内容的提问来源于stack exchange,提问作者Cyrus the Great
相关产品推荐
相关产品推荐

