Flutter-布局

1)ListView:

   示意如下:

   主要用于新闻和用户中心

2)GridView:

  示意如下:主要用于商品列表,应用列表

GridView.count实现网格布局: 拥有一行配置元素数量参数crossAxisCount: 4,

GridView.extend实现网格布局,与上面差别在于参数不同

GridView.builder实现动态网格布局

1)GridView.count

GridView.count(
       crossAxisCount: 4,
       children: const <Widget> [
         Icon(Icons.pedal_bike),

2)GridView.extend

  

return GridView.extent(
      maxCrossAxisExtent: 40,//最大长度
      children: const [
Icon(Icons.pedal_bike),

间距

   只想要间距,就用padding,不必用container

return const Padding(  //padding就是实现间距

       padding: EdgeInsets.all(20),

       child: Text("hello"),

Row:让多个元素排列在一行

默认宽度自适应,占满上层组件赋予的整行

    一般其上会有container

    注意占满屏幕的两个方法:

 //width: 4000,//非常大,就占满了整个屏幕
       width: double.infinity,//获取屏幕整个宽度

Widget build(BuildContext context) {
     return Container(
       //width: 4000,//非常大,就占满了整个屏幕
       width: double.infinity,//获取屏幕整个宽度
       //height: 7000,
       height: double.infinity,
       color: Colors.black54,
       child: Row(//外部没有container,则是自适应的
             mainAxisAlignment: MainAxisAlignment.spaceEvenly,
             crossAxisAlignment: CrossAxisAlignment.start,
             children:[
              IconContainer(Icons.holiday_village,color: Colors.blue,),
               IconContainer(Icons.account_box,color: Colors.orange,),
               IconContainer(Icons.alarm,color: Colors.blue,),
      ],
  
     )
           );
     

进入infinity可以看到,这是无穷大,还有maxFinite可以用

abstract class double extends num {
  static const double nan = 0.0 / 0.0;
  static const double infinity = 1.0 / 0.0;
  static const double negativeInfinity = -infinity;
  static const double minPositive = 5e-324;
  static const double maxFinite = 1.7976931348623157e+308;

Column:让多个元素排列在一列

默认高度自适应  占满上层组件赋予的整列

Flex:

   Row和Column都继承于flex组件

注意如下flex要放在child前,不然第二个expanded 提示修改

flex:决定了占几份,如果给Iconcontainer设置宽度是没有效果的

 return Row(
    
            children:[
              Expanded(
                flex: 1,
                child: IconContainer(Icons.holiday_village,color: Colors.blue,),//占一份
                
                ),
              Expanded(
                child:  IconContainer(Icons.account_box,color: Colors.orange,),
                flex: 2,//占2份
                
                ),

也可以将return row改成:

    

   return Flex(//这里也可以用cloumn或者row,用了flex,就要指定direction
            //direction: Axis.horizontal,//水平分配
            direction: Axis.vertical,

比如要实现右边固定宽度,左边自适应

那么对于右边元素,不要设置flex,就会采用其本身宽度

Stack &Positioned:绝对定位

stack:可以堆在一起

positioned:指定两个坐标,相对外层容器

如果position里面是row,还需要制定宽度高度,否则报错,控制台无限循环

return Container(

      height: 400,

      width: 300,

      color: Colors.blue,

          child: Stack(

            children: [

              Positioned(

                left: 10,

                bottom: 10, //代表底部左侧

                child: Container(

                 width: 100,

                height: 100,

                 color: Colors.yellow,



              ),

              ),

              const Positioned(

                right: 0,

                top: 190,

                child:  Text("hello 1116"),

              ),

             

获取设备高度宽度

Widget build(BuildContext context) {
    final size=MediaQuery.of(context).size;//不能用infinite,获取设备宽度和高度
     return Stack(
     children: [
     ListView(
      padding: const EdgeInsets.only(top: 50),//避免顶部被下面的导航遮盖
       children: const  [
        ListTile(title:Text("i am liebiao1") ),
        ListTile(title:Text("i am liebiao2")) ,
        ListTile(title:Text("i am liebiao3") ),
        ListTile(title:Text("i am liebiao4") , ),
         ListTile(title:Text("i am liebiao5") , ),
          ListTile(title:Text("i am liebiao6") , ),
           ListTile(title:Text("i am liebiao7") , ),
         ListTile(title:Text("i am liebiao8") , ),
          ListTile(title:Text("i am liebiao9") , ),
           ListTile(title:Text("i am liebiao10") , ),
         ListTile(title:Text("i am liebiao11") , ),
          ListTile(title:Text("i am liebiao12") , ),
             ListTile(title:Text("i am liebiao13") , ),
          ListTile(title:Text("i am liebiao14") , ),
           ListTile(title:Text("i am liebiao15") , ),
         ListTile(title:Text("i am liebiao16") , ),
          ListTile(title:Text("i am liebiao17") , ),


       ],

     ),
     
     Positioned(
      left: 0,
      top:0,
      width: size.width,//获取设备宽度
      height: 44,
      child:Container(
          alignment: Alignment.topLeft,
          height: 44,
          color: Colors.black,
          child: const Text("二级导航",
                     style:TextStyle(color: Colors.white) ,),
        ),
      
      
      ),

    ],


     );
  }

Stack&Align

Align也可以作为元素

 return Container(
      width: 300,
      height: 300,
      color: Colors.red,
      child: const Align(   //Align 如果要居中也可以直接用center
        alignment: Alignment.bottomRight,
       child:Text("你好,i7i8i9 "),

      )

    alignment: Alignment(-1, 1),也可以这样设置()里面的是x,y单位不是像素

-1,1左侧底部

1,1 右侧底部

    

 实现单行居左居右,

row+align无效果,只能用stack+align

return Stack(
     children: const [
        Align(alignment: Alignment.topLeft,child: Text("收藏") ,),
       Align(alignment: Alignment.topRight,child: Text("购买") ,),

     ],
     );

实现方法2:

cloumn+container+stack+Align

因为只用了宽度高度,container可以改为sizedbox

 return Column(
       children: [
        Container(
       width: double.infinity,
       height: 40,
       child: Stack(
     children: const [
        Align(alignment: Alignment.topLeft,child: Text("收藏") ,),
       Align(alignment: Alignment.topRight,child: Text("购买") ,),

     ],
     ),

        )

       ],


     )

实现方法3:更容易定位到具体位置

cloumn+sizedbox+stack+positioned

stack上层套包裹一层,要么是有宽高的box或最外层,不能直接是column

return Column(
       children: [
        SizedBox(
       width: double.infinity,
       height: 40,
       child: Stack(
     children: const [
        Align(alignment: Alignment.topLeft,child: Text("收藏") ,),
       Align(alignment: Alignment.topRight,child: Text("购买") ,),

     ],
     ),

        ),
         SizedBox(
       width: double.infinity,
       height: 40,
       child: Stack(
     children: const [
      Positioned(
        left: 10,
        child:  Text("收藏")),
       Positioned(
        right: 10,
        child:  Text("购买")),

     ],
     ),

        )

       ],


     )

宽高比

 return AspectRatio(
      aspectRatio: 3/1,//宽度是屏幕宽度,高度是容器一半,用在图片上较多
      child: Container(
        color: Colors.red,
      
      ),

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

i7i8i9com

创业创新像大树那样给更多人乘凉

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值