Flutter - 容器 BoxShadow 在 ListView 中滚动时消失

Posted

技术标签:

【中文标题】Flutter - 容器 BoxShadow 在 ListView 中滚动时消失【英文标题】:Flutter - Container BoxShadow disappears on scroll in a ListView 【发布时间】:2017-10-04 20:52:30 【问题描述】:

这是我的容器的样子:

new Container(
        width: 500.0,
        height: 250.0,
        padding: new EdgeInsets.fromLTRB(20.0, 40.0, 20.0, 40.0),
        decoration: new BoxDecoration(
          color: const Color(0xFF66BB6A),
          boxShadow: [new BoxShadow(
            color: Colors.black,
            blurRadius: 20.0,
          ),]
        ),
        child: new Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            new Container(
              padding: new EdgeInsets.fromLTRB(0.0, 0.0, 0.0, 10.0),
              child: new Text("Testtext", style: new TextStyle(fontSize: 30.0, fontFamily: "Barrio", color: new Color.fromARGB(255, 230, 230, 230))),
            ),
          ]
        ),
      ),

它与其他一些容器位于 ListView 内。一旦我开始滚动 ListView,阴影就会消失。加载视图时,它显示正确。

对这个问题有什么想法吗?

谢谢

【问题讨论】:

【参考方案1】:

我试图重现该问题,但我注意到您没有在容器上设置任何边距。 ListView 中的其他项目很可能会覆盖您手动绘制的阴影,因为它是在您的 Container 范围之外绘制的。

我建议您使用Card 而不是容器。您可以使用 elevation 构造函数参数获得看起来很自然的材质阴影。卡片带有一些内置边距,如果需要,您可以通过将其包含在 Container 中来添加更多边距。这将为您提供足够的空间让阴影可见。您可以使用color 构造函数参数控制Card 的颜色。

Card 的角略微圆润。如果您不想要圆角,那么您将偏离 Material Design 的规范,但您可以尝试将 MaterialMaterialType.canvastype 括在 Container 内。

【讨论】:

是的,边距是问题!非常感谢您解释问题... :)【参考方案2】:

此其他答案适用于需要继续使用Container 的人:

Container(
  decoration: BoxDecoration(
    shape: BoxShape.circle, // BoxShape.circle or BoxShape.retangle
    //color: const Color(0xFF66BB6A),
    boxShadow: [BoxShadow(
      color: Colors.grey,
      blurRadius: 5.0,
    ),]
  ),
  child: ...
),

【讨论】:

【参考方案3】:

经过多次尝试,我解决了这个问题。

// if scroll view overflow on other widget then use ClipRRect With Expanded.

    ClipRRect(
    child: Expanded(
    child: ListView(
    clipBehavior: Clip.none, //add this line inside AnyScrollView or ListView
      children:[
         Container(
             decoration: BoxDecoration(boxShadow: [
                BoxShadow(
                      offset: Offset(2, 2),
                      blurRadius: 12,
                      color: Color.fromRGBO(0, 0, 0, 0.16),
                )
               ]),
             child: Widgets(),
           ),
      ],
    ),
  ),
),

我遇到了同样的问题,我使用了这个技巧,它已经解决了。

【讨论】:

以上是关于Flutter - 容器 BoxShadow 在 ListView 中滚动时消失的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:如何为透明容器添加阴影?

Flutter如何在任意孩子上使用boxShadow?

Flutter Container BoxShadow 不显示

Flutter 添加阴影效果

Flutter-ShapeDecoration

css Boxshadow仅在一侧或多侧