Flutter 页面布局 Padding Row Column Expanded

Flutter Padding组件

Flutter中,不是所有的组件都有padding属性来控制元素内不间距的.我们就可以通过Flutter为我们提供的Padding组件来实现

属性 说明
padding padding 值,EdgeInsetss 设置填充的值
child 子组件

下面我们通过一个GridView不通过横向和竖向间距的属性达到给GridView下的内容进行隔离开.
实现逻辑:
1.对GridView下的子组件添加Padding组件,设置左边距10,上边距10.(此时会发现最右边的子元素紧贴着手机屏幕边缘)
2.对GridView外层添加Padding组件,设置右边距,达到视觉间隔的效果
实现效果如下:

image.png

代码:

import "package:flutter/material.dart";
class Demo01 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: '练习页面',
      home: Scaffold(
        appBar: AppBar(
          title: Text('练习页面')
        ),
        body: Container(
          child: GetGridViewList()
        )
      ),
    );
  }
}
class GetGridViewList extends StatelessWidget {
    @override
  Widget build(BuildContext context) {
    List imageList = [
      'https://dss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=158710161,3575221320&fm=26&gp=0.jpg',
      'https://dss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=158710161,3575221320&fm=26&gp=0.jpg',
      'https://dss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=158710161,3575221320&fm=26&gp=0.jpg',
      'https://dss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=158710161,3575221320&fm=26&gp=0.jpg',
      'https://dss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=158710161,3575221320&fm=26&gp=0.jpg',
      'https://dss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=158710161,3575221320&fm=26&gp=0.jpg',
      'https://dss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=158710161,3575221320&fm=26&gp=0.jpg',
    ]; 
    Widget _getImageList(context, index) {
      return Container(
        child: Column(
          children: <Widget>[
            Padding(
              padding: EdgeInsets.fromLTRB(10, 10, 0, 0), // 给图片组件的左和上添加10的padding距离
              child: Image.network(imageList[index], fit: BoxFit.cover)
            )
          ],
        )
      );
    }
    return Padding(
      //- EdgeInsets.fromLTRB 4个参数分别是左,上,右,下
      padding: EdgeInsets.fromLTRB(0, 0, 10, 0),  //- 对整个GridView添加一个右边距
      child: GridView.builder(
        gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
          crossAxisCount: 2, //- 一行的Widget 数量,
          childAspectRatio: 1.44,  //- 设置宽度和高度的比例
        ),
        itemCount: imageList.length,
        itemBuilder: _getImageList,
      )  
    );
  }
}

自定义按钮组件(参数传递)

在讲Row组件和Column组件之前,我们先看一下组件之间的参数传递以及构造函数的使用(必传参数和可选参数)
通过参数传递,调用IconContainer组件实现每次调用可以传入不同的值,显示不同的图标以及颜色和大小

import 'package:flutter/material.dart';

class RowAndColumnPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {

    return MaterialApp(
      title: "Row and Column",
      home: Scaffold(
        appBar: AppBar(
          title: Text('Row and Clumn'),
        ),
        body: Column(
          children: <Widget>[
            RowWidget(), //- Row 组件展示
          ],
        )
      )
    );
  }
}

class RowWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return IconContainer(Icons.home, color: Colors.green);
  }
}

class IconContainer extends StatelessWidget {
  // 定义一个构造函数,把图标,大小,颜色进行动态传入接收
  // size和color为可选参数,我们设置一个默认值
  double size = 32.0;
  Color color = Colors.orangeAccent;
  IconData icon; 
  IconContainer(this.icon,{this.color, this.size});  //- 这种写法表示icon为必填参数, color和size为可选参数
  @override
  Widget build(BuildContext context) {
    return Container(
      width: 100.0,
      height: 100.0,
      color: this.color,
      child: Center(
        child: Icon(this.icon, size: this.size, color: Colors.white)
      )
    );
  }
}

Flutter Row组件

水平布局组件

属性 说明
mainAxisAlignment 主轴的排序方式
crossAxisAlignment 次轴的排序方式
children 组件子元素

我们结合前面的例子,RowWidget组件现在需要多次调用IconContainer组件,传入不同的参数,这个时候使用Row组件来实现,其中Row组件下的children属性允许我们传入一个List<Widget>.

class RowWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Row(
      children: <Widget>[
        IconContainer(Icons.home, color: Colors.green),
        IconContainer(Icons.arrow_forward, color: Colors.blueGrey),
        IconContainer(Icons.adjust, color: Colors.deepOrange),
      ],
    );
  }
}

这样就简单的实现了调用IconContainer组件传入不同的参数,通过Row组件进行横向布局.页面效果:

image.png

设置主轴属性 mainAxisAlignment

下面介绍一下 mainAxisAlignment属性,通过MainAxisAlignment调用会发现下面还有一些属性,例如center

image.png

这里列举一下各个属性的显示样式:

start

image.png

center

image.png

end

image.png

spaceAround(元素之间的距离是页面边距离的两倍)

image.png

spaceBetween

image.png

spaceEvenly

image.png
设置次轴属性 crossAxisAlignment

前面的例子中,只有一行横向位置,无法体现出crossAxisAlignment属性的效果,我们在Row外面套一层容器,并设置高和宽之后,通过crossAxisAlignment次轴属性来在横向布局的纵向进行操作.

class RowWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      height: 300.0,
      width: 400.0,
      color: Colors.lightBlue,
      child: Row(
        mainAxisAlignment: MainAxisAlignment.end,
        children: <Widget>[
          IconContainer(Icons.home, color: Colors.green),
          IconContainer(Icons.arrow_forward, color: Colors.blueGrey),
          IconContainer(Icons.adjust, color: Colors.deepOrange)
        ],
      ),
    );
  }
}

上面的代码在外层设置了容器后,显示如下:


image.png

同样,我们调用次轴属性后依然会有很多属性选择


image.png

简单方便理解的使用表格说明一下,特殊的采用图文的形式表达:
属性 说明
center 次轴居中
start 次轴靠前(当前是Row组件所以是靠上显示)
end 次轴靠后(当前是Row组件所以是靠下显示)
CrossAxisAlignment.stretch(次轴占满整个屏幕)
image.png

Flutter Column组件

垂直布局组件

属性 说明
mainAxisAlignment 主轴的排序方式
crossAxisAlignment 次轴的排序方式
children 组件子元素

垂直布局组件Column用法与Row组件用法相同,注意主轴和次轴对应的方向使用既可.

Flutter Expanded 类似Web中的Flex

Expanded 组件可以用在Row 和Column布局中

属性 说明
flex 元素占整个父Row/Column的比例
chile 子元素

我们在实际项目中经常会遇到一个情况,左边一个区块显示图片,右边是新闻标题.但是左边的图片位置的剩余部分的全部宽度都要显示为文字区域.
效果如下:

image.png

我们可以采用Expanded把元素包起来,并设置flex属性来解决就可以了

import 'package:flutter/material.dart';

class RowAndColumnPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {

    return MaterialApp(
      title: "Row and Column",
      home: Scaffold(
        appBar: AppBar(
          title: Text('Row and Clumn'),
        ),
        body: Column(
          children: <Widget>[
            RowWidget(), //- Row 组件展示
          ],
        )
      )
    );
  }
}

class RowWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Row(
      children: <Widget>[
        Container(
          width:100.0,
          height:100.0,
          child: Image.network(
            'https://dss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=158710161,3575221320&fm=26&gp=0.jpg',
             fit: BoxFit.cover
          ),
        ),
        Expanded(
          flex: 1,
          child: ListTile(
            title: Text('这里是新闻的标题这里是新闻的标题这里是新闻的标题',overflow: TextOverflow.ellipsis,),
            subtitle: Text('这里是副标题这里是副标题这里是副标题这里是副标题这里是副标题这里是副标题这里是副标题这里是副标题这里是副标题这里是副标题', overflow: TextOverflow.ellipsis,maxLines: 2)
          )
        ),
      ],
    );
  }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,755评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,369评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,799评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,910评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,096评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,159评论 3 411
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,917评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,360评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,673评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,814评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,509评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,156评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,123评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,641评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,728评论 2 351

推荐阅读更多精彩内容