Flutter 组件之Card(卡片)、AspectRatio(宽高比) 、Wrap(流布局)

AspectRatio(宽高比) 设置

宽高比相对于整个外层容器来设置,如果外层是全局屏幕, 宽高比就是按照屏幕的多少比例显示。 如果像下面的例子,宽度是300 宽高比为2/1 那么宽度就是300 。高度就是150

 class LearnAspectRatio extends StatelessWidget {
   @override
   Widget build(BuildContext context) {
      //TODO: implement build
      return Container(
        width: 300,
        // height: 200,
        // color: Colors.pink,
        child: AspectRatio(//宽高比 铺满整个页面,
          aspectRatio:2.0/1.0,
          child:Container(
            color: Colors.orange,
          )
        ),
      );
   }
 }

Card(卡片)

实现一个卡片列表

静态卡片

//静态卡片
 class LearnCard extends StatelessWidget {
   @override
   Widget build(BuildContext context) {
     // TODO: implement build
     return ListView(children: <Widget>[//一个竖向列表
       Card(//定义一个卡片
         margin: EdgeInsets.all(10),//外边距设置
         child: Column(children: <Widget>[//列布局
           AspectRatio(//上面的宽高比模块
               aspectRatio: 2.0 / 1.0,//宽高比为2/1
               child: Image.network(//网络图片
                   "https://timgsa.baidu.com/timg.jpg",
                   fit: BoxFit.cover)),//填充满整个元素
           ListTile(//列表元素
             leading: ClipOval(child:Image.network("https://timgsa.baidu.com/timg4.jpg",//裁剪头像
                   fit: BoxFit.cover,width: 60,height: 60,)),
             title: Text(//主标题
               "高级工程师",
               style: TextStyle(fontSize: 40),//文字样式
             ),
             subtitle: Text("我是一个高级工程师,现在还在北京上班 "),//副标题
           ),
           ListTile(title: Text("电话:1888888888888")),//列表元素
           ListTile(title: Text("地址:慷慨激昂冻死了房间里卡聚隆科技了")),//列表元素
         ]),
       ),
       Card(//下一个卡片基本一样的内容
         margin: EdgeInsets.all(10),
         child: Column(children: <Widget>[
           AspectRatio(//设置宽高比
               aspectRatio: 2.0 / 1.0,
               child: Image.network(
                 "https://timgsa.baidu.com/timg3.jpg",
                 fit: BoxFit.cover,
               )),
           ListTile(
             leading: ClipOval(child:Image.network(
                 "https://timgsa.baidu.com/timg83.jpg",
                 fit: BoxFit.cover,height: 60,width: 60,
               )),
             title: Text(
               "高级工程师1",
               style: TextStyle(fontSize: 40),
             ),
             subtitle: Text("我是一个高级工程师,现在还在北京上班 "),
           ),
           ListTile(title: Text("电话:alsjfklsajdfksakdflasjdf")),
           ListTile(title: Text("地址:safleje;o;aoe;ojfe")),
         ]),
       ),
       Card(
         margin: EdgeInsets.all(10),
         child: Column(children: <Widget>[
           AspectRatio(aspectRatio: 2.0/1.0,child: Image.network(
               "https://timgsa.baidu.com/ti4.jpg%3Fdown",
               fit: BoxFit.cover,
             )),
           ListTile(
             leading: CircleAvatar(backgroundImage: NetworkImage("https://timgsa.baidu.com/timg124.jpg%3Fdown",)),
             title: Text(
               "高级工程师2",
               style: TextStyle(fontSize: 40),
             ),
             subtitle: Text("我是一个高级工程师,现在还在北京上班 "),
           ),
           ListTile(title: Text("电话:1999999999999")),
           ListTile(title: Text("地址:施蒂利克福建省了的房间里可使肌肤卡时间段里看风景 ")),
         ]),
       ),
     ]);
   }
 }

动态卡片

数据是上一章示例数据

// 动态卡片
 class LearnCard extends StatelessWidget {
   List<Widget> _getData() {	//定义遍历方法
     var temp = casts.map((value) {//遍历
       return Card(//返回卡片控件
           margin: EdgeInsets.all(10),//边距
           child: Column(children: <Widget>[//列布局
             AspectRatio(//宽高比设置
                 aspectRatio: 2.0 / 1.0,//宽高比
                 child: Image.network(//网络图片
                     value["avatars"],//图片动态地址
                     fit: BoxFit.cover)),//充满元素
             ListTile(//列表元素 头像可以使用CircleAvatar组件,自动裁剪
               leading: ClipOval(
                   child: Image.network(
                 value["avatars"],
                 fit: BoxFit.cover,
                 width: 60,
                 height: 60,
               )),
               title: Text(
                 value["name"],
                 style: TextStyle(fontSize: 40),
               ),
               subtitle: Text(value["name_en"]),
             ),
             ListTile(title: Text("电话:1888888888888")),
             ListTile(title: Text("地址:慷慨激昂冻死了房间里卡聚隆科技了")),
           ]));
     });
     return temp.toList();
   }

   @override
   Widget build(BuildContext context) {
     // TODO: implement build
     return ListView(//定义列表
       children: this._getData(),//调用获取动态卡片数据方法
     );
   }
 }

Wrap(流布局)

就像许多按钮元素长度不一,但是要随机排列, 不管元素宽度是否一致会自动换行展示。还可以设置主轴方向边距,文本方向,摆放顺序,对齐方式,间距
在这里插入图片描述

class LearnWrap extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Wrap(
      spacing: 10,//主轴边距
      runSpacing: 10,//run 的间距
      direction:Axis.horizontal,//横向还是纵向展示
      alignment: WrapAlignment.start,//整体从哪开始 就是css juetify-content的方式    
      runAlignment: WrapAlignment.center,//Y轴对齐方式
      children: <Widget>[
        MyButton("第一级"),
         MyButton("第一级11222"),
         MyButton("第一级222"),
         MyButton("第一级2222"),
         MyButton("第一级222"),
         MyButton("第一级222"),
         MyButton("第一级2333322"),
         MyButton("第一级2242"),
         MyButton("第一级2242"),
         MyButton("第一级2244444442"),

      ],
    );
   
  }
}

// 定义自定义Button组件
class MyButton extends StatelessWidget {//封装按钮组件
  String btnName;
  var callBack;
  MyButton(this.btnName,{Key key}) :super(key:key);
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return RaisedButton(
      child: Text(this.btnName),
      textColor: Theme.of(context).accentColor,
      onPressed: (){
        print("111------------");
      },
    );
  }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Flutter中可以使用`StaggeredGridView`来实现瀑布布局。`StaggeredGridView`是一个可以根据内容动态调整大小的网格布局。下面是一个简单的示例代码: 首先,需要在`pubspec.yaml`文件中添加`flutter_staggered_grid_view`依赖: ```yaml dependencies: flutter: sdk: flutter flutter_staggered_grid_view: ^0.4.0 ``` 然后,在Dart文件中导入依赖: ```dart import 'package:flutter/material.dart'; import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart'; ``` 接下来,可以使用`StaggeredGridView.countBuilder`构建瀑布布局: ```dart class MyStaggeredGridView extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Staggered Grid View'), ), body: StaggeredGridView.countBuilder( crossAxisCount: 4, // 列数 itemCount: 20, // 子项数量 itemBuilder: (BuildContext context, int index) => Container( color: Colors.blueGrey, child: Center( child: CircleAvatar( backgroundColor: Colors.white, child: Text('$index'), ), ), ), staggeredTileBuilder: (int index) => StaggeredTile.count(2, index.isEven ? 2 : 1), // 控制子项的大小 mainAxisSpacing: 4.0, // 主轴间距 crossAxisSpacing: 4.0, // 横轴间距 ), ); } } ``` 在上面的示例中,`StaggeredTile.count`用于控制子项的大小,通过判断`index`的奇偶性来实现交错布局。`mainAxisSpacing`和`crossAxisSpacing`用于设置主轴和横轴的间距。 这只是一个简单的示例,你可以根据自己的需求进行更多的定制和样式修改。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值