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

Flutter中SizeTransition导致Container圆角未正常生效的问题求助

解决SizeTransition动画中Container圆角不生效的问题

问题根源在于SizeTransition通过ClipRect动态裁剪子组件,动画过程中裁剪区域是直角矩形,子组件的圆角会被完全裁掉,只有当动画完成、裁剪区域覆盖整个容器时,圆角才会显示。

以下是三种可行的解决方案:

方案一:用AnimatedBuilder控制容器宽度(推荐)

直接通过动画值控制Container的宽度,避开SizeTransition的裁剪逻辑:

Stack(
  alignment: Alignment.centerLeft,
  children: [
    Container(
      width: 300,
      height: 20,
      decoration: BoxDecoration(
          color: const Color(0XFFC41D3D).withOpacity(0.5),
          borderRadius: const BorderRadius.all(Radius.circular(15))),
    ),
    AnimatedBuilder(
      animation: _controller,
      builder: (context, child) {
        // 计算当前动画对应的宽度
        final currentWidth = Tween(begin: 0.0, end: 300.0)
            .chain(CurveTween(curve: const Interval(0.0, 0.4)))
            .evaluate(_controller);
        return Container(
          width: currentWidth,
          height: 20,
          decoration: BoxDecoration(
              color: const Color(0XFFC41D3D),
              borderRadius: BorderRadius.circular(15.0)),
        );
      },
    ),
  ],
)

方案二:给子组件套ClipRRect

保留SizeTransition的同时,用ClipRRect对子组件进行圆角裁剪,让裁剪区域匹配圆角:

Stack(
  alignment: Alignment.centerLeft,
  children: [
    Container(
      width: 300,
      height: 20,
      decoration: BoxDecoration(
          color: const Color(0XFFC41D3D).withOpacity(0.5),
          borderRadius: const BorderRadius.all(Radius.circular(15))),
    ),
    SizeTransition(
      axis: Axis.horizontal,
      sizeFactor: Tween(begin: 0.0, end: 1.0)
          .chain(CurveTween(curve: const Interval(0.0, 0.4)))
          .animate(_controller),
      child: ClipRRect(
        borderRadius: BorderRadius.circular(15.0),
        // 直接用color代替decoration,避免重复设置圆角
        child: Container(
          width: 300,
          height: 20,
          color: const Color(0XFFC41D3D),
        ),
      ),
    ),
  ],
)

方案三:用Align组件控制宽度

通过Align的widthFactor属性配合动画实现尺寸变化,同样能避免裁剪问题:

Stack(
  alignment: Alignment.centerLeft,
  children: [
    Container(
      width: 300,
      height: 20,
      decoration: BoxDecoration(
          color: const Color(0XFFC41D3D).withOpacity(0.5),
          borderRadius: const BorderRadius.all(Radius.circular(15))),
    ),
    Align(
      alignment: Alignment.centerLeft,
      widthFactor: Tween(begin: 0.0, end: 1.0)
          .chain(CurveTween(curve: const Interval(0.0, 0.4)))
          .evaluate(_controller),
      child: Container(
        width: 300,
        height: 20,
        decoration: BoxDecoration(
            color: const Color(0XFFC41D3D),
            borderRadius: BorderRadius.circular(15.0)),
      ),
    ),
  ],
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 14:42:28