From 8a1c53848d33110d17478d3217a95257f71dc985 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Fri, 1 Aug 2025 14:41:12 +0800 Subject: [PATCH] =?UTF-8?q?refactor(widget):=20=E4=BC=98=E5=8C=96=E5=A3=B0?= =?UTF-8?q?=E9=9F=B3=E6=9F=B1=E5=8A=A8=E7=94=BB=E7=BB=84=E4=BB=B6=E6=80=A7?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 使用 AnimatedBuilder 替代直接监听动画状态 - 添加组件挂载检查防止内存泄漏 - 改进动画停止时的过渡效果 - 更新相关注释说明 --- .../agent/widgets/sound_bar_widget.dart | 48 +++++++++++-------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/lib/modules/agent/widgets/sound_bar_widget.dart b/lib/modules/agent/widgets/sound_bar_widget.dart index 11fb9ed86..9028f713b 100644 --- a/lib/modules/agent/widgets/sound_bar_widget.dart +++ b/lib/modules/agent/widgets/sound_bar_widget.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../controllers/agent_controller.dart'; -/// 声音柱动画组件 +/// 声音柱动画组件 (已优化) /// 用于显示语音输入时的音频波形效果 class SoundBarWidget extends StatefulWidget { final double delay; @@ -37,9 +37,8 @@ class _SoundBarWidgetState extends State parent: _controller, curve: Curves.easeInOut, ), - )..addListener(() { - setState(() {}); - }); + ); + // 移除了 .addListener(() { setState(() {}); }) _startOrStopAnimation(); } @@ -54,6 +53,9 @@ class _SoundBarWidgetState extends State /// 开始或停止动画 void _startOrStopAnimation() { + // 确保组件仍然挂载在树上 + if (!mounted) return; + if (widget.isActive) { Future.delayed(Duration(milliseconds: (widget.delay * 1000).toInt()), () { if (mounted && widget.isActive) { @@ -61,9 +63,10 @@ class _SoundBarWidgetState extends State } }); } else { - _controller.reset(); - // 设置为小高度的静态状态 - _controller.animateTo(0.1, duration: const Duration(milliseconds: 300)); + // 停止并平滑地过渡到初始状态 + _controller.stop(); + _controller.animateTo(0.0, + duration: const Duration(milliseconds: 200), curve: Curves.easeOut); } } @@ -77,21 +80,28 @@ class _SoundBarWidgetState extends State Widget build(BuildContext context) { final primaryColor = Theme.of(context).primaryColor; - return Container( - width: 2.5, - height: widget.isActive ? _animation.value : 3, - margin: const EdgeInsets.symmetric(horizontal: 1), - decoration: BoxDecoration( - color: widget.isActive - ? primaryColor.withOpacity(0.8) - : Colors.grey.withOpacity(0.4), - borderRadius: BorderRadius.circular(1.5), - ), + // 使用 AnimatedBuilder 来优化性能 + return AnimatedBuilder( + animation: _animation, + builder: (context, child) { + return Container( + width: 2.5, + // 当动画不活跃时,高度固定为3;活跃时使用动画值 + height: widget.isActive ? _animation.value : 3, + margin: const EdgeInsets.symmetric(horizontal: 1), + decoration: BoxDecoration( + color: widget.isActive + ? primaryColor.withOpacity(0.8) + : Colors.grey.withOpacity(0.4), + borderRadius: BorderRadius.circular(1.5), + ), + ); + }, ); } } -/// 声音柱组合组件 +/// 声音柱组合组件 (无需改动) /// 包含多个声音柱的组合显示 class SoundBarsWidget extends StatelessWidget { final bool isActive; @@ -120,7 +130,7 @@ class SoundBarsWidget extends StatelessWidget { } } -/// 带控制器集成的声音柱组件 +/// 带控制器集成的声音柱组件 (无需改动) /// 自动从AgentController获取状态 class AgentSoundBarsWidget extends StatelessWidget { final int barCount;