边界半径不适用于容器小部件

NIR*_*TEL 5 flutter

边框半径不适用于子级内部Container。尝试了SizedBoxStack小部件。我需要容器内的边框视图。

Scaffold(
  appBar: AppBar(
    title: new Text("ListView"),
  ),
  body: Center(
      child: Padding(
        padding: EdgeInsets.all(15.0),
        child: Container(
            decoration: BoxDecoration(
                borderRadius: BorderRadius.circular(15.0),
                border: Border.all(
                    color: Colors.green,
                    width: 2.0
                )
            ),
            child: Container(
              color: Colors.red,
            )
        ),
      )
  )
)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

Ste*_*wie 68

其他答案已经指出您需要使用ClipRRect将边框半径应用于 的子小部件Container

但是,Container小部件现在具有clipBehaviour剪辑其子级的属性:

Container(
  // Add the line below
  clipBehavior: Clip.hardEdge,
  decoration: BoxDecoration(
    borderRadius: BorderRadius.circular(15.0),
    border: Border.all(color: Colors.green, width: 2.0)),
  child: Container(
    color: Colors.red,
  ),
);
Run Code Online (Sandbox Code Playgroud)

使用此属性而不是嵌套小部件以获得干净的代码是一个很好的做法。

  • 这应该被接受的答案。 (4认同)
  • 这是最好的答案,因为使用 ClipRRect 需要更多的处理器资源。 (3认同)

Raj*_*dav 34

试试这个,使用ClipRRect并嵌套在另一个中Container,现在您可以添加非统一边框

Container(
                    decoration: BoxDecoration(
                      color: Colors.white,
                      borderRadius: BorderRadius.circular(10),
                      boxShadow: [BoxShadow(color: Colors.black12, blurRadius: 5)],
                    ),
                    child: ClipRRect(
                      borderRadius: BorderRadius.circular(10),
                      child: Container(
                        padding: EdgeInsets.all(20),
                        decoration: BoxDecoration(
                          border: Border(
                            left: BorderSide(color: Colors.indigo, width: 5),
                          ),
                        ),
                        child: Column(
                          mainAxisSize: MainAxisSize.min,
                          children: <Widget>[
                            Icon(Icons.home),
                            Text("Home"),
                          ],
                        ),
                      ),
                    ),
                  )
Run Code Online (Sandbox Code Playgroud)


小智 17

代替

容器

小部件使用

剪辑矩形

之前(不工作):

 Center(
        child: Container(
          decoration: BoxDecoration(
            borderRadius: _getAllRoundedBorderRadius(),
          ),
          child: Hero(
            tag: "CossackHero",
            child: TweenImage(
              last: AssetImage("images/background/cossack_0.jpg"),
              first: AssetImage("images/background/c_cossack_0.jpg"),
              duration: 2,
              height: height,
            ),
          ),
        ),
      ),
Run Code Online (Sandbox Code Playgroud)

后:

Center(
        child: ClipRRect(
          borderRadius: getAllRoundedBorderRadius(),
          child: Hero(
            tag: "CossackHero",
            child: TweenImage(
              last: AssetImage("images/background/cossack_0.jpg"),
              first: AssetImage("images/background/c_cossack_0.jpg"),
              duration: 2,
              height: height,
            ),
          ),
        ),
      ),
Run Code Online (Sandbox Code Playgroud)


Har*_*sad 15

decoration被画在孩子身后。如果要将装饰应用在容器的孩子面前,请使用foregroundDecoration

Scaffold(
  appBar: AppBar(
    title: new Text("ListView"),
  ),
  body: Center(
      child: Padding(
        padding: EdgeInsets.all(15.0),
        child: Container(
            foregroundDecoration: BoxDecoration(
                borderRadius: BorderRadius.circular(15.0),
                border: Border.all(
                    color: Colors.green,
                    width: 2.0
                )
            ),
            child: Container(
              color: Colors.red,
            )
        ),
      )
  )
)
Run Code Online (Sandbox Code Playgroud)

上面的代码在子容器前面绘制边框。请注意,即使有foregroundDecoration子容器也会有尖角。

如果您希望子容器具有圆角,则您需要应用于borderRadius子容器或使用ClipRRect与父容器相同的边框半径


Man*_*awa 8

const innerRadius = 15.0;
const borderWidth = 2.0;
const borderColor = Colors.green;
const color = Colors.red;
const size = 100.0;

Container(
  decoration: BoxDecoration(
    borderRadius: BorderRadius.circular(innerRadius + borderWidth),
    color: borderColor,
  ),
  padding: EdgeInsets.all(borderWidth),
  child: ClipRRect(
    borderRadius: BorderRadius.circular(innerRadius),
    child: Container(
      color: color,
      width: size,
      height: size,
    ),
  ),
);
Run Code Online (Sandbox Code Playgroud)

它看起来是这样的:

在此输入图像描述

以及它是如何工作的:https://codepen.io/mshibanami/pen/LYyQJXa


顺便说一句,一些答案建议您使用Container包含以下内容decoration的答案:bordercolor

Container(
  width: size,
  height: size,
  decoration: BoxDecoration(
    borderRadius: BorderRadius.circular(innerRadius),
    border: Border.all(
      color: borderColor,
      width: borderWidth,
    ),
    color: color,
  ),
)
Run Code Online (Sandbox Code Playgroud)

还可以,但并不理想,因为内部颜色稍微超出边框。所以当边框接近背景颜色时,它可能会像这样突出:

在此输入图像描述


Cop*_*oad 7

截屏:

在此输入图像描述


ClipRRect(使用 2 Container

ClipRRect(
  borderRadius: BorderRadius.circular(16),
  child: Container(
    width: 100,
    height: 100,
    color: Colors.black,
    child: Container(
      margin: EdgeInsets.all(8),
      color: Colors.blue,
    ),
  ),
)
Run Code Online (Sandbox Code Playgroud)

没有ClipRRect(使用 1 Container

Container(
  width: 100,
  height: 100,
  decoration: BoxDecoration(
    borderRadius: BorderRadius.circular(16),
    border: Border.all(
      color: Colors.black,
      width: 4,
    ),
    color: Colors.blue,
  ),
)
Run Code Online (Sandbox Code Playgroud)


Zul*_*qar 5

用这个替换你的代码

Scaffold(
appBar: AppBar(
title: new Text("ListView"),
),
body: Center(
  child: Padding(
    padding: EdgeInsets.all(15.0),
    child: Container(
        decoration: BoxDecoration(
            borderRadius: BorderRadius.circular(15.0),
            border: Border.all(
                color: Colors.green,
                width: 2.0
            )
        ),
        child: Container(
              decoration: new BoxDecoration(borderRadius: 
        BorderRadius.circular(15.0),
                        color: Colors.red,),
                    )
    ),
  )
)
)
Run Code Online (Sandbox Code Playgroud)