flutter 布局学习

RowWidget 横向布局

  • 不灵活布局
import 'package:flutter/material.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: "Row Widget Demo",home: Scaffold(appBar: new AppBar(title: new Text("水平方向布局"),),body: new Row(children: <Widget>[new RaisedButton(onPressed: () {},color: Colors.red,child: new Text('red button'),),new RaisedButton(onPressed: () {},color: Colors.orangeAccent,child: new Text('orange button'),),new RaisedButton(onPressed: () {},color: Colors.lightBlue,child: new Text('blue button'),),],),),);}
}


这时候你会发现的页面已经有了三个按钮,但这三个按钮并没有充满一行,而是出现了空隙。这就是不灵活横向排列造成的。它根据子元素的大小来进行排列。如果我们想实现充满一行的效果,就要使用灵活水平布局了。

  • 灵活水平布局
    解决上面有空隙的问题,可以使用 Expanded来进行解决,也就是我们说的灵活布局。我们在按钮的外边加入Expanded就可以了,代码如下:
import 'package:flutter/material.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: "Row Widget Demo",home: Scaffold(appBar: new AppBar(title: new Text("水平方向布局"),),body: new Row(children: <Widget>[Expanded(child: new RaisedButton(onPressed: () {},color: Colors.red,child: new Text('red button'),),),Expanded(child: new RaisedButton(onPressed: () {},color: Colors.yellow,child: new Text('yellow button'),),),Expanded(child: new RaisedButton(onPressed: () {},color: Colors.lightBlue,child: new Text('blue button'),),),],),),);}
}

这时候就可以布满一行了,效果如下图。

  • 灵活和不灵活的混用
import 'package:flutter/material.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: "Row Widget Demo",home: Scaffold(appBar: new AppBar(title: new Text("水平方向布局"),),body: new Row(children: <Widget>[new RaisedButton(onPressed: () {},color: Colors.red,child: new Text('red button'),),Expanded(child: new RaisedButton(onPressed: () {},color: Colors.yellow,child: new Text('yellow button'),),),new RaisedButton(onPressed: () {},color: Colors.lightBlue,child: new Text('blue button'),)],),),);}
}

ColumnWidget 纵向布局

import 'package:flutter/material.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: "Column Widget Demo",home: Scaffold(appBar: new AppBar(title: new Text("垂直方向布局"),),body: new Column(children: <Widget>[Text("hanyajun"),Text("hanyajun.com"),Text("I love coding"),],),),);}
}

这时候你会发现文字是以最长的一段文字居中对齐的,看起来很别扭。那如果想让文字以左边开始对齐,只需要加入一个对齐属性。

  • CrossAxisAlignment.star:居左对齐。
  • CrossAxisAlignment.end:居右对齐。
  • CrossAxisAlignment.center:居中对齐
import 'package:flutter/material.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: "Column Widget Demo",home: Scaffold(appBar: new AppBar(title: new Text("垂直方向布局"),),body: new Column(crossAxisAlignment: CrossAxisAlignment.start,children: <Widget>[Text("hanyajun"),Text("hanyajun.com"),Text("I love coding"),],),),);}
}

主轴和副轴的辨识

在设置对齐方式的时候你会发现右mainAxisAlignment属性,意思就是主轴对齐方式,那什么是主轴,什么又是幅轴那。

  • main轴:如果你用column组件,那垂直就是主轴,如果你用Row组件,那水平就是主轴。

  • cross轴:cross轴我们称为幅轴,是和主轴垂直的方向。比如Row组件,那垂直就是幅轴,Column组件的幅轴就是水平方向的。

主轴和幅轴我们搞清楚,才能在实际工作中随心所欲的进行布局。

比如现在我们要把上面的代码,改成垂直方向居中。因为用的是Column组件,所以就是主轴方向,这时候你要用的就是主轴对齐了。

import 'package:flutter/material.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: "Column Widget Demo",home: Scaffold(appBar: new AppBar(title: new Text("垂直方向布局"),),body: new Column(crossAxisAlignment: CrossAxisAlignment.center,mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[Text("hanyajun"),Text("hanyajun.com"),Text("I love coding"),],),),);}
}

水平方向相对屏幕居中

让文字相对于水平方向居中,我们如何处理?其实只要加入Center组件就可以轻松解决。

import 'package:flutter/material.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: "Column Widget Demo",home: Scaffold(appBar: new AppBar(title: new Text("垂直方向布局"),),body: Center(child: new Column(crossAxisAlignment: CrossAxisAlignment.center,mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[Text("hanyajun"),Text("hanyajun.com"),Text("I love coding"),],)),),);}
}

Expanded属性的使用

其实在学习水平布局的时候我们对Expanded有了深刻的理解,它就是灵活布局。比如我们想让中间区域变大,而头部区域和底部根据文字所占空间进行显示。

import 'package:flutter/material.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: "Column Widget Demo",home: Scaffold(appBar: new AppBar(title: new Text("垂直方向布局"),),body: new Column(crossAxisAlignment: CrossAxisAlignment.center,mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[Center(child: Text("hanyajun")),Expanded(child: Center(child: Text("hanyajun.com"))),Center(child: Text("I love coding")),],),),);}
}

Stack Widget 层叠布局

在头像上方再放入一个容器,容器里边写上字,这时候我们就可以使用Stack布局。

import 'package:flutter/material.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {var stack = new Stack(alignment: const FractionalOffset(0.5, 0.8),//设置对齐方式0-1children: <Widget>[new CircleAvatar(backgroundImage: new NetworkImage("https://hanyajun.com/img/avatar/self.jpg"),radius: 100.0, //半径),new Container(decoration: new BoxDecoration(color: Colors.lightBlue,),padding: EdgeInsets.all(5.0),child: new Text("hanyajun"),),],);return MaterialApp(title: "Column Widget Demo",home: Scaffold(appBar: new AppBar(title: new Text("垂直方向布局"),),body: Center(child: stack,),),);}
}
  • 层叠布局的 alignment 属性
    alignment属性是控制层叠的位置的,建议在两个内容进行层叠时使用。它有两个值X轴距离和Y轴距离,值是从0到1的,都是从上层容器的左上角开始算起的。

  • CircleAvatar组件的使用
    CircleAvatar这个经常用来作头像的,组件里边有个radius的值可以设置图片的弧度。

Positioned属性

  • Positioned组件的属性
  • bottom: 距离层叠组件下边的距离
  • left:距离层叠组件左边的距离
  • top:距离层叠组件上边的距离
  • right:距离层叠组件右边的距离
  • width: 层叠定位组件的宽度
  • height: 层叠定位组件的高度
import 'package:flutter/material.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {var stack = new Stack(//alignment: const FractionalOffset(0.5, 0.8), //设置对齐方式0-1children: <Widget>[new CircleAvatar(backgroundImage: new NetworkImage("https://hanyajun.com/img/avatar/self.jpg"),radius: 100.0, //半径),new Positioned(top: 10.0,left: 59.0,child: new Text("hanyajun.com"),),new Positioned(bottom: 10.0,right: 80.0,child: new Text("韩亚军"),),],);return MaterialApp(title: "Column Widget Demo",home: Scaffold(appBar: new AppBar(title: new Text("垂直方向布局"),),body: Center(child: stack,),),);}
}

card widget

import 'package:flutter/material.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {var card = new Card(child: Column(children: <Widget>[ListTile(title: Text("湖北省咸宁市咸安区", style: TextStyle(fontWeight: FontWeight.w500)),subtitle: Text("朗月清风:123123123123"),leading: new Icon(Icons.account_box, color: Colors.lightBlue),),ListTile(title: Text("湖北省咸宁市咸安区", style: TextStyle(fontWeight: FontWeight.w500)),subtitle: Text("朗月清风:123123123123"),leading: new Icon(Icons.account_box, color: Colors.lightBlue),),ListTile(title: Text("湖北省咸宁市咸安区", style: TextStyle(fontWeight: FontWeight.w500)),subtitle: Text("朗月清风:123123123123"),leading: new Icon(Icons.account_box, color: Colors.lightBlue),),ListTile(title: Text("湖北省咸宁市咸安区", style: TextStyle(fontWeight: FontWeight.w500)),subtitle: Text("朗月清风:123123123123"),leading: new Icon(Icons.account_box, color: Colors.lightBlue),),],),);return MaterialApp(title: "Column Widget Demo",home: Scaffold(appBar: new AppBar(title: new Text("垂直方向布局"),),body: Center(child: card,),),);}
}

代码中使用了一个垂直布局组件Column组件,然后利用了ListTile实现内部列表,这里需要说明的是ListTile不光可以使用在ListView组件中

flutter-布局学习相关推荐

  1. Flutter学习第七天 flutter布局

    这个转自我自己的有道云 想看图片去那里 文档:Day3_6 flutter布局.md 链接:http://note.youdao.com/noteshare?id=b6399e53df489374f1 ...

  2. 学习笔记-Flutter 布局(四)- Baseline、FractionallySizedBox、IntrinsicHeight、IntrinsicWidth详解...

    Flutter 布局(四)- Baseline.FractionallySizedBox.IntrinsicHeight.IntrinsicWidth详解 本文主要介绍Flutter布局中的Basel ...

  3. 学习笔记-Flutter 布局(二)- Padding、Align、Center详解

    Flutter 布局(二)- Padding.Align.Center详解 本文主要介绍Flutter布局中的Padding.Align以及Center控件,详细介绍了其布局行为以及使用场景,并对源码 ...

  4. Flutter 布局 - UI - 官方文档 - 学习速记(一)

    设置crossAxisAlignment属性值为CrossAxisAlignment.start,这会将该列中的子项左对齐. 获取主题色:Theme.of(context).primaryColor; ...

  5. Flutter 布局控件完结篇

    本文对Flutter的29种布局控件进行了总结分类,讲解一些布局上的优化策略,以及面对具体的布局时,如何去选择控件. 1. 系列文章 Flutter 布局详解 Flutter 布局(一)- Conta ...

  6. 视频教程-Flutter布局实战网易新闻客户端-flutter

    Flutter布局实战网易新闻客户端 Flutter书籍作者.曾任职于多家互联网大型企业,担任移动端项目技术负责人,主导研发和攻关技术难题,项目涉及教育.金融.医疗.交通.车载设备.智能家居等众多领域 ...

  7. 全网最全Flutter的学习文档,不可转载

    Flutter学习文档-Author:Brath 由于文章内容较干,请允许Brath打一波广告- 面试记APP Github:https://github.com/Guoqing815/intervi ...

  8. 【Flutter】Flutter 布局组件 ( 布局组件简介 | Row 组件 | Column 组件 | SizedBox 组件 | ClipOval 组件 )

    文章目录 一.Flutter 布局相关的组件简介 二.Row 和 Column 组件 三.SizedBox 组件 四.ClipOval 组件 五. 完整代码示例 六. 相关资源 一.Flutter 布 ...

  9. flutter布局-8-animated_icons动画图片

    示例 github:flutterlayout https://github.com/LiuC520/flutterlayout MaterialApp 连载:flutter布局-1-column 连 ...

  10. CSS3与页面布局学习总结(八)——浏览器兼容与前端性能优化

    一.浏览器兼容 1.1.概要 世界上没有任何一个浏览器是一样的,同样的代码在不一样的浏览器上运行就存在兼容性问题.不同浏览器其内核亦不尽相同,相同内核的版本不同,相同版本的内核浏览器品牌不一样,各种运 ...

最新文章

  1. VScode 无法创建文件或者无法保存文件
  2. 【Python进阶】Python进阶专栏、编程与开源框架知识星球上线,等你来follow
  3. 在windows上模拟linux环境,MSYS2——Windows平台下模拟linux环境的搭建-Go语言中文社区...
  4. springboot整合redis操作缓存(将查询到的数据放在缓存中)
  5. 指定应用程序网络连接_总结Java开发Web应用程序应该理解的几个知识点
  6. 语句include和require的区别是什么?
  7. 使用ReportNG更好看的TestNG HTML测试报告– Maven指南
  8. caffe各层参数详解
  9. java tostring的用处_JAVA的tostring()方法的作用是什么呢?
  10. 数据库都可以“自动驾驶”了,传统DBA何去何从?
  11. PHP提示Notice: Undefined variable的解决办法
  12. PaddleOCR实现车牌识别系统
  13. 阈值分割法——最佳阈值的选择问题
  14. vue项目引入阿里巴巴矢量图标库图标
  15. jrebel使用方法
  16. CondaUpgradeError: This environment has previously been operated on by a conda version that‘s newer
  17. word怎么转pdf原格式不变?可以试试这个途径
  18. 图片批量转换成pdf
  19. vs+cmake完美编译RTS游戏,类似魔兽争霸源码
  20. usleep()和sleep()的区别

热门文章

  1. 从ACL 2022 Onsite经历看NLP热点
  2. WWDC21主题演讲6 月 8 日凌晨1点开幕
  3. IT桔子IT互联网公司产品数据库及商业信息服务
  4. 美食小吃加盟网站源码餐饮奶茶招商加盟类网站
  5. 第四十二篇:Flink面试方案设计篇
  6. ROS使用介绍——rosbag
  7. 项目管理--关键链方法
  8. linux 虚拟光驱软件,在Linux操作系统下使用虚拟光驱的方法
  9. 深入理解 Mysql 锁
  10. 【九】分布式微服务架构体系详解——共识问题