Android 如何强制小部件占用其周围的可用空间,而不管其形状如何?

Android 如何强制小部件占用其周围的可用空间,而不管其形状如何?,android,flutter,dart,frontend,Android,Flutter,Dart,Frontend,对于上下文,我想创建如下内容: 我已经走了这么远: 我如何强制容器(或任何小部件,最终它应该作为不同颜色的按钮工作)采用这种形状? 此代码仅适用于您看到的卡: class ChooseUsageCardOffline extends StatelessWidget { final h; final w; ChooseUsageCardOffline({this.h, this.w}); @override Widget build(BuildContext context

对于上下文,我想创建如下内容:

我已经走了这么远:

我如何强制容器(或任何小部件,最终它应该作为不同颜色的按钮工作)采用这种形状? 此代码仅适用于您看到的卡:

class ChooseUsageCardOffline extends StatelessWidget {
  final h;
  final w;
  ChooseUsageCardOffline({this.h, this.w});
  @override
  Widget build(BuildContext context) {
    return AspectRatio(
      aspectRatio: 1.4,
      child: Card(
          color: cc.dark_2,
          shape: RoundedRectangleBorder(
            borderRadius: BorderRadius.all(Radius.circular(30)),
            side: BorderSide(color: cc.dark_3),
          ),
          child: FlatButton(
           onPressed: () {},
           child: Padding(
             padding: EdgeInsets.fromLTRB(0, h/35, w/100, 0),
               child: Column(
               mainAxisAlignment: MainAxisAlignment.start,
               crossAxisAlignment: CrossAxisAlignment.start,
               children: [
                 Row(
                   children: [
                     Align(
                       alignment: Alignment.bottomLeft,
                       child: Text("OFFLINE", style: TextStyle(color: cc.light_1, fontWeight: FontWeight.w500, fontSize: h / 18)
                        )
                       ),
                       SizedBox(width: w * 0.23),
                      Align(
                       alignment: Alignment.topRight,
                       child: Icon(Icons.device_hub, size: w * 0.15, color: cc.light_2,)
                       ), 
                   ],
                 ),
                 SizedBox(height: h / 50),
                 Text("Maximum Security, edit data Anywhere you are", style: TextStyle(color:cc.light_2, fontSize: h/40),),
                 SizedBox(height: h / 13),
                Expanded(
                  child:Container(color: Colors.blue,)
                )
                  
               ],
             ),
           )
        ),
      ),
    );
  }
}


问题在于填充应用于列的所有子级,包括下部容器

您需要删除列周围的填充,并将其分别应用于每个小部件(不包括较低的容器)

然后,在
小部件上,您需要添加一个
clipBehavior:Clip.hardEdge
以正确获得圆角边

下面是一个简单的示例,您可以复制并试用:

导入“包装:颤振/材料.省道”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“颤振演示”,
debugShowCheckedModeBanner:false,
主题:主题数据(
主样本:颜色。蓝色,
),
主页:MyHomePage(),
);
}
}
类MyHomePage扩展了无状态小部件{
MyHomePage({Key}):超级(Key:Key);
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(),
正文:中(
子:容器(
身高:400,
宽度:300,
孩子:卡片(
clipBehavior:Clip.hardEdge,
颜色:颜色,黑色,
形状:圆形矩形边框(
borderRadius:borderRadius.all(半径圆形(30)),
侧边:边框侧边(颜色:Colors.blue),
),
子:列(
儿童:[
已展开(子:容器()),
容器(高度:40,颜色:颜色。红色),
],
),
),
),
),
);
}
}

问题在于填充应用于列的所有子级,包括较低的容器

您需要删除列周围的填充,并将其分别应用于每个小部件(不包括较低的容器)

然后,在
小部件上,您需要添加一个
clipBehavior:Clip.hardEdge
以正确获得圆角边

下面是一个简单的示例,您可以复制并试用:

导入“包装:颤振/材料.省道”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“颤振演示”,
debugShowCheckedModeBanner:false,
主题:主题数据(
主样本:颜色。蓝色,
),
主页:MyHomePage(),
);
}
}
类MyHomePage扩展了无状态小部件{
MyHomePage({Key}):超级(Key:Key);
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(),
正文:中(
子:容器(
身高:400,
宽度:300,
孩子:卡片(
clipBehavior:Clip.hardEdge,
颜色:颜色,黑色,
形状:圆形矩形边框(
borderRadius:borderRadius.all(半径圆形(30)),
侧边:边框侧边(颜色:Colors.blue),
),
子:列(
儿童:[
已展开(子:容器()),
容器(高度:40,颜色:颜色。红色),
],
),
),
),
),
);
}
}

要使小部件根据其父小部件的边界调整自身大小,请使用
FittedBox()
小部件包装它。查看颤振官方频道的视频了解更多细节

代码如下所示:

child:FittedBox(
fit:Boxfit.fill,//因为您希望它具有周围空间的形状。
孩子:你的小部件(
//...
),
),

要使小部件根据其父小部件的边界调整自身大小,请使用
FittedBox()
小部件包装它。查看颤振官方频道的视频了解更多细节

代码如下所示:

child:FittedBox(
fit:Boxfit.fill,//因为您希望它具有周围空间的形状。
孩子:你的小部件(
//...
),
),

谢谢,工作顺利!谢谢你,工作了!
class ChooseUsageCardOffline extends StatelessWidget {
  final h;
  final w;
  ChooseUsageCardOffline({this.h, this.w});
  @override
  Widget build(BuildContext context) {
    return AspectRatio(
      aspectRatio: 1.4,
      child: Card(
        color: Colors.red,
        clipBehavior: Clip.antiAlias, // Add clip type.
        shape: RoundedRectangleBorder(
          borderRadius: BorderRadius.all(Radius.circular(30)),
          side: BorderSide(color: Colors.green),
        ),
        child: FlatButton(
          padding: EdgeInsets.all(0), // Remove default padding in FlatButton
            onPressed: () {},
            child: Padding(
              padding: EdgeInsets.fromLTRB(0, h/35, w/100, 0),
              child: Column(
                mainAxisAlignment: MainAxisAlignment.start,
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  Row(
                    children: [
                      Align(
                          alignment: Alignment.bottomLeft,
                          child: Text("OFFLINE", style: TextStyle(color: Colors.red, fontWeight: FontWeight.w500, fontSize: h / 18)
                          )
                      ),
                      SizedBox(width: w * 0.23),
                      Align(
                          alignment: Alignment.topRight,
                          child: Icon(Icons.device_hub, size: w * 0.15, color: Colors.red,)
                      ),
                    ],
                  ),
                  SizedBox(height: h / 50),
                  Text("Maximum Security, edit data Anywhere you are", style: TextStyle(color:Colors.red, fontSize: h/40),),
                  SizedBox(height: h / 13),
                  Expanded(
                      child:Container(color: Colors.blue,)
                  )

                ],
              ),
            )
        ),
      ),
    );
  }
}