Flutter AnimatedContainer内边距导致关闭窗口时右下角异常的问题解决
解决Flutter AnimatedContainer关闭时右下角闪显问题
问题原因
你遇到的闪显问题,本质是收起窗口时,AnimatedContainer保留了padding属性,但内部child变为空Container。此时AnimatedContainer会以padding的尺寸(vertical:32、horizontal:144)存在,虽然颜色透明度为0,但动画结束前这个空容器的布局会短暂触发渲染,导致右下角出现闪显。移除padding后,空容器尺寸为0,自然不会有这个问题。
解决方案
以下两种方法都能保留padding效果,同时解决闪显问题:
方法1:将padding移至展开状态的child内部
把AnimatedContainer的padding属性移除,转而在展开时的内容外层添加Padding组件。这样收起时child为空,padding也随之消失,容器尺寸变为0,不会产生多余渲染。
修改后的关键代码:
AnimatedContainer( duration: const Duration(milliseconds: 300), // 移除这里的padding decoration: BoxDecoration( color: Colors.white.withOpacity(_isExpanded ? 0.9 : 0.0), borderRadius: BorderRadius.circular(10.0), ), child: _isExpanded ? ClipRRect( borderRadius: BorderRadius.circular(10.0), child: BackdropFilter( filter: ImageFilter.blur(sigmaX: _isExpanded ? 5.0 : 0.0, sigmaY: _isExpanded ? 5.0 : 0.0), // 在这里添加Padding child: Padding( padding: const EdgeInsets.symmetric(vertical: 16.0, horizontal: 72.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ _buildOption(Icons.phone, 'Şoförü Ara'), _buildOption(Icons.insert_comment, 'Şoföre Mesaj At'), _buildOption(Icons.phone, 'Hostesi Ara'), _buildOption(Icons.insert_comment, 'Hostese Mesaj At'), ], ), ), ), ) : Container(), )
方法2:让padding随展开状态动画变化
保留AnimatedContainer的padding,但让它在收起时变为EdgeInsets.zero,和透明度、child的状态同步动画。这样收起过程中padding逐渐缩小至0,不会出现空容器带padding的情况。
修改后的关键代码:
AnimatedContainer( duration: const Duration(milliseconds: 300), // 根据_isExpanded动态切换padding padding: _isExpanded ? const EdgeInsets.symmetric(vertical: 16.0, horizontal: 72.0) : EdgeInsets.zero, decoration: BoxDecoration( color: Colors.white.withOpacity(_isExpanded ? 0.9 : 0.0), borderRadius: BorderRadius.circular(10.0), ), child: _isExpanded ? ClipRRect( // 原有child内容不变 borderRadius: BorderRadius.circular(10.0), child: BackdropFilter( filter: ImageFilter.blur(sigmaX: _isExpanded ? 5.0 : 0.0, sigmaY: _isExpanded ? 5.0 : 0.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ _buildOption(Icons.phone, 'Şoförü Ara'), _buildOption(Icons.insert_comment, 'Şoföre Mesaj At'), _buildOption(Icons.phone, 'Hostesi Ara'), _buildOption(Icons.insert_comment, 'Hostese Mesaj At'), ], ), ), ) : Container(), )
注意事项
两种方法都能解决问题,推荐方法1——它更符合布局逻辑:padding是内容的内边距,而非容器本身的属性,能避免不必要的布局计算。
内容的提问来源于stack exchange,提问作者Hasan Altay
相关产品推荐
相关产品推荐

