一、Container

是一个便利的Widget,它把通用的绘制、定位和Widget的大小结合了起来。
Container会先用padding填充子Widget和border之间的空白,然后添加其他的额外的约束constraints,最后会把剩余的都用margin来填充。
在绘制的过程中,会优先绘制transform,然后是decoration,最后是foregroundDecoration。
对于一个没有子Widget的Container,在没有一些约束的条件时,它会尽可能的大;而一旦有了约束或者子Widget,它就会变得尽可能小。
下面是代码演示时间:

首先基础代码如下:

image.png

后面的每次都是替换图中的方法。

  • 没有任何子Widget时
  1. static _baseContainer() {
  2. return new Container(
  3. color: Colors.red,
  4. );
  5. }

此时的截图如下:

image.png

发现它尽可能的占了全部。
此时,设置padding是不起作用的。

  • 没有其他约束,只有一个子widget时
  1. static _addWidgetToContainer() {
  2. return new Container(
  3. color: Colors.red,
  4. child: new Text("Container"),
  5. );
  6. }

此时变成了下面的样子:

image.png

它几乎和子Widget贴合到了一起了。

  • 当限制了宽度的时候
  1. static _limitWidth() {
  2. return new Container(
  3. color: Colors.red,
  4. child: new Text("Container"),
  5. width: 20.0,
  6. // width: 200.0,
  7. // height: 10.0,
  8. );
  9. }

可以肯定,文字的宽度要比20大,因为此时没有限制高度,所以会展示成下面的样子:

image.png

可以发现它的高度自动变大了,直到能把所有的内容容纳下来。

  • 当限制了高度的时候

    假设这个时候宽度是足够的,如果限制了高度,高度如果足够,则会正常展示,但是如果高度不够的时候就会出现越界的现象,如下所示:

    image.png
如果我指定了宽度和高度里的一个,而没有一些约束和子Widget,未指定的会尽可能最大。
  • 当限制了宽和高的时候

    可以确定,宽高足够的时候,是能够完美展示的。如果宽度不够,高度也不够呢,会是什么样的展示呢?

    image.png
  • 限定宽度或者高度,指定padding
    当padding的宽度超过了width,则会默认保留左padding或者上padding。
  1. static _limitWidthWithPadding() {
  2. return new Container(
  3. color: Colors.red,
  4. padding: const EdgeInsets.all(20.0),
  5. height: 20.0,
  6. width: 20.0,
  7. child: new Text("Container"),
  8. );
  9. }
image.png
  • contraints约束
  1. static _boxContraints() {
  2. return new Row(
  3. crossAxisAlignment: CrossAxisAlignment.start,
  4. mainAxisAlignment: MainAxisAlignment.center,
  5. children: <Widget>[
  6. new Container(
  7. // 相当于直接制定了该Container的宽和高,且它的优先级要高于width和height
  8. constraints: new BoxConstraints.expand(width: 250.0, height: 150.0),
  9. color: Colors.red,
  10. width: 100.0,
  11. height: 100.0,
  12. // 设置Container的最大和最小宽度和高度
  13. // constraints: new BoxConstraints(
  14. // maxWidth: 50.0,
  15. // ),
  16. ),
  17. new Container(
  18. color: Colors.green,
  19. width: 100.0,
  20. height: 100.0,
  21. )
  22. ],
  23. );
  24. }

这里主要展示了它的默认初始化和指定初始化方法的Expand,其中后者就相当于直接制定了该Container的宽和高。

  • foregroundDecoration

    这个比较重要,它会堵在Container的所有子Widget的前面,另外还有一些圆角和背景的问题,具体的见下图:

    image.png

    代码为:

  1. static _foregroundDecoration() {
  2. return new Center(
  3. child: new Container(
  4. color: Colors.red,
  5. constraints: new BoxConstraints.expand(width: 300.0, height: 300.0,),
  6. foregroundDecoration: new BoxDecoration(
  7. color: Colors.blue,
  8. border: new Border.all(color: Colors.yellow, width: 5.0,),
  9. borderRadius: new BorderRadius.all(new Radius.circular(50.0)),
  10. gradient: new LinearGradient(colors: [Colors.blue, Colors.green]),
  11. ),
  12. alignment: Alignment.center,
  13. child: new Text("Container"),
  14. ),
  15. );
  16. }

可以发现,对于有背景图的Container,只是简单的切圆角是有问题的;而且它还会堵住子Widget。

  • decoration

    针对上面提到的会堵住子Widget和切角问题,decoration可以很好的解决问题,不过这里需要注意⚠️:Container的color和该属性不能共存。所以最后的代码和效果图如下:

    image.png
  1. static _decoration() {
  2. return new Center(
  3. child: new Container(
  4. // color: Colors.red, // 不能和decoration共存
  5. constraints: new BoxConstraints.expand(width: 300.0, height: 300.0,),
  6. alignment: Alignment.center,
  7. child: new Text("Container"),
  8. decoration: new BoxDecoration(
  9. color: Colors.blue,
  10. border: new Border.all(color: Colors.yellow, width: 5.0,),
  11. borderRadius: new BorderRadius.all(new Radius.circular(50.0)),
  12. gradient: new LinearGradient(colors: [Colors.blue, Colors.green]),
  13. ),
  14. ),
  15. );
  16. }

二、Row

Row在前面聊过,最主要注意的一点就是内容不能超过边界,否则会出错误。
这里补充的是如果使用了Expanded,那么其中的Widget的尺寸就不再起作用。如下:

  1. static _baseRow() {
  2. return new Container(
  3. color: Colors.red,
  4. height: 300.0,
  5. child: new Row(
  6. // 会超出去,展示错误
  7. // children: <Widget>[
  8. // new Container(width: 200.0, color: Colors.green,),
  9. // new Container(width: 200.0, color: Colors.blue,),
  10. // new Container(width: 200.0, color: Colors.cyan,),
  11. // ],
  12. children: <Widget>[
  13. // 使用了Expanded后,尺寸不再起作用
  14. new Expanded(child: new Container(width: 50.0, color: Colors.green,)),
  15. new Expanded(child: new Container(width: 100.0, color: Colors.blue,)),
  16. new Expanded(child: new Container(width: 100.0, color: Colors.cyan,)),
  17. ],
  18. ),
  19. );
  20. }

这里的使用了Expanded的Container就不会再起作用

三、Column(同Row)

四、Text

有两种初始化方法,Text和Text.rich。

五、Icon

Icon是不响应事件的,IconButton可以。

六、RaisedButton

通俗的翻译:浮起来的按钮,先看两个截图吧,有个直观的认识:

正常展示
按钮正在被点击中

默认情况下,可以看到被点击中的按钮浮起来了。

注意⚠️:它有个参数onPressed,如果没有定义回调函数,则无论你怎么设置,该按钮的状态都是失效状态,而且其他所有的属性,只要是和disable无关的,无论怎么设置都不会起作用。

1、直接初始化

具体的详细说明如下:

  1. raisedButtonWithChild() {
  2. return new Center(
  3. child: new RaisedButton(
  4. onPressed: this.clickedRaisedButton,
  5. color: Colors.green,
  6. // child: new Text('Raised Button', style: new TextStyle(color: Colors.black),),
  7. child: new Text(
  8. 'Raised Button',
  9. ),
  10. textColor: Colors.white, // 该按钮上的文字颜色,但是前提是不设置字体自身的颜色时才会起作用
  11. // highlightColor: Colors.yellow, // 高亮时的背景色
  12. disabledColor: Colors.deepOrange, // 失效时的背景色
  13. disabledTextColor: Colors.grey, // 按钮失效时的文字颜色,同样的不能使用文本自己的样式或者颜色时才会 起作用
  14. splashColor: Colors.purple, // 点击按钮时的渐变背景色,当你不设置高亮背景时才会看的更清楚
  15. colorBrightness: Brightness.dark, // 这个我也不知道
  16. elevation: 15.0, // 正常情况下浮动的距离
  17. highlightElevation: 5.0, // 高亮时的浮动距离(可以尝试将该值设置的比elevation小,看看体验)
  18. disabledElevation: 50.0,
  19. padding: const EdgeInsets.all(20.0),
  20. shape: new Border.all(
  21. // 设置边框样式
  22. color: Colors.blue,
  23. width: 4.0,
  24. style: BorderStyle.solid,
  25. ),
  26. animationDuration: new Duration(
  27. // 过程时间,最容易观察的是从elevation到highlightElevation,或者相反过程,但是前提是要彻底的按下去,注意其影子的变化
  28. seconds: 5,
  29. ),
  30. onHighlightChanged: this.hightLightChanged, // 可以用来监听按钮的按下和放开过程
  31. textTheme: ButtonTextTheme.accent, // 搞不懂这个
  32. ),
  33. );
  34. }

2、重定向icon初始化

该方法得到的RaisedButton默认有两个Widget,而且是必传的;其他参数都和直接初始化没什么区别。具体的代码如下:

  1. raisedButtonWithIcon() {
  2. return new Center(
  3. child: new RaisedButton.icon(
  4. onPressed: this.clickedRaisedButton,
  5. icon: new Icon(Icons.star),
  6. label: new Text('RaisedButton'),
  7. ),
  8. );
  9. }

效果图如下:

image.png

七、AppBar

这里有个官方的解释图,比较形象的说明了AppBar的结构:

app_bar.png

这里因为对其他的Widget还不熟悉,所以暂时没办法做bottom。做了一个效果图,如下所示:

image.png

实现这部分的代码如下:

  1. class AppBarWidget extends StatefulWidget {
  2. @override
  3. State<StatefulWidget> createState() => new AppBarState();
  4. }
  5. class AppBarState extends State<AppBarWidget> {
  6. @override
  7. Widget build(BuildContext context) {
  8. // TODO: implement build
  9. return new MaterialApp(
  10. debugShowCheckedModeBanner: false, // 在调试期间,右上角的DEBUG字样
  11. home: new Scaffold(
  12. appBar: new AppBar(
  13. title: new Text(
  14. 'AppBar',
  15. style: new TextStyle(
  16. // 设置字体样式
  17. color: Colors.white,
  18. fontWeight: FontWeight.bold,
  19. ),
  20. ), // title
  21. // centerTitle: true, // 当设置了actions之后,title的位置会发生变化,使用该属性,可以让标题忽略actions占去的空间居中
  22. // titleSpacing: 0.0,
  23. elevation: 0.0, // 下部的影子,该值越大,影子越清楚,为0时,不会有影子,和RaisedButton是一样的
  24. backgroundColor: Colors.cyan, // 背景色
  25. leading: this.appBarLeading(),
  26. actions: this.appBarActions(),
  27. bottom: null, // 这个先放一放
  28. // flexibleSpace: new FlexibleSpaceBar( // 这个有什么用呢????貌似是说只有在appbar的size改变的时候才会起作用
  29. // title: new Text('Flexible'),
  30. // // centerTitle: false,
  31. // ),
  32. ),
  33. ),
  34. );
  35. }
  36. appBarActions() {
  37. return <Widget>[
  38. new Container(
  39. width: 50.0,
  40. child: new Icon(
  41. Icons.star_border,
  42. color: Colors.red,
  43. ),
  44. ),
  45. new Container(
  46. width: 50.0,
  47. child: new Icon(Icons.share),
  48. ),
  49. new Container(
  50. color: Colors.orange,
  51. width: 50.0,
  52. margin: const EdgeInsets.only(
  53. left: 5.0,
  54. right: 5.0,
  55. ),
  56. alignment: Alignment.center,
  57. child: new Text('actions'),
  58. ),
  59. ];
  60. }
  61. // 经过实验发现,leading是限制了大小的
  62. appBarLeading() {
  63. return new RaisedButton(
  64. onPressed: this.clickedLeadingBtn,
  65. child: new Text(
  66. 'Leading',
  67. ),
  68. textColor: Colors.white,
  69. color: Colors.red,
  70. elevation: 0.0,
  71. disabledElevation: 0.0,
  72. highlightElevation: 0.0,
  73. // highlightColor: Colors.cyan,
  74. colorBrightness: Brightness.light,
  75. splashColor: Colors.red,
  76. padding: const EdgeInsets.all(5.0),
  77. );
  78. }
  79. clickedLeadingBtn() {
  80. print('Clicked Leading');
  81. }
  82. }

八、FlutterLogo

用来展示Flutter的logo的,真是任性啊,为了一个Logo,专门写了一个Widget。

具体的效果如下:

image.png

代码为:

  1. class _FlutterLogoState extends State<_FlutterLogoWidget> {
  2. var _status = 0;
  3. clickedToChangeStatus() {
  4. setState(() {
  5. _status = (_status + 1) % 3;
  6. });
  7. }
  8. @override
  9. Widget build(BuildContext context) {
  10. // TODO: implement build
  11. FlutterLogoStyle style = FlutterLogoStyle.markOnly;
  12. if (_status == 1) {
  13. style = FlutterLogoStyle.horizontal;
  14. } else if (_status == 2) {
  15. style = FlutterLogoStyle.stacked;
  16. }
  17. return new Center(
  18. child: new Column(
  19. children: <Widget>[
  20. new Container(
  21. margin: const EdgeInsets.only(
  22. top: 30.0,
  23. bottom: 30.0,
  24. ),
  25. child: new RaisedButton(
  26. onPressed: this.clickedToChangeStatus,
  27. color: Colors.green,
  28. child: new Text('Change Status'),
  29. ),
  30. ),
  31. new FlutterLogo(
  32. size: 50.0,
  33. colors: Colors.red, // 图的颜色
  34. textColor: Colors.orange, // 只对带文字的style起作用
  35. // style: FlutterLogoStyle.markOnly, // 只有图
  36. style: style, // 左图右文
  37. // style: FlutterLogoStyle.stacked, // 上图下文
  38. duration: new Duration(
  39. // 当colors、textColor或者style变化的时候起作用
  40. seconds: 3,
  41. ),
  42. curve: Curves.elasticOut, // 动画方式
  43. )
  44. ],
  45. ),
  46. );
  47. }
  48. }

九、PlaceHolder

通俗讲,就是一个用来占位的Widget,提示开发人员,这里需要暂时保留。效果如下:

image.png

代码也很简单,甚至不用多写任何东西,只要初始化了就行了。

  1. new Container(
  2. width: 100.0,
  3. margin: const EdgeInsets.only(top: 30.0),
  4. child: new Placeholder(
  5. fallbackWidth: 100.0,
  6. fallbackHeight: 100.0,
  7. color: Colors.orange,
  8. ),
  9. )

Flutter学习笔记(五)的更多相关文章

  1. Flutter学习笔记(4)--Dart函数

    如需转载,请注明出处:Flutter学习笔记(4)--Dart函数 Dart是一个面向对象的语言,所以函数也是对象,函数属于Function对象,函数可以像参数一样传递给其他函数,这样便于做回调处理: ...

  2. Flutter学习笔记(5)--Dart运算符

    如需转载,请注明出处:Flutter学习笔记(5)--Dart运算符 先给出一个Dart运算符表,接下来在逐个解释和使用.如下:                            描述       ...

  3. Flutter学习笔记(11)--文本组件、图标及按钮组件

    如需转载,请注明出处:Flutter学习笔记(10)--容器组件.图片组件 文本组件 文本组件(text)负责显示文本和定义显示样式,下表为text常见属性 Text组件属性及描述 属性名 类型 默认 ...

  4. Flutter学习笔记(23)--多个子元素的布局Widget(Rwo、Column、Stack、IndexedStack、Table、Wrap)

    如需转载,请注明出处:Flutter学习笔记(23)--多个子元素的布局Widget(Rwo.Column.Stack.IndexedStack.Table.Wrap) 上一篇梳理了拥有单个子元素布局 ...

  5. Flutter学习笔记(1)--环境安装

    flutter最近显得格外的火,公司的同事也一直在谈论flutter,感觉自己不学学就要失业了...所以决定顺应潮流学习以下flutter,做一下学习笔记,希望可以给需要的同学带来一些帮助~ 正文为f ...

  6. C#可扩展编程之MEF学习笔记(五):MEF高级进阶

    好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...

  7. (转)Qt Model/View 学习笔记 (五)——View 类

    Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...

  8. java之jvm学习笔记五(实践写自己的类装载器)

    java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...

  9. Learning ROS for Robotics Programming Second Edition学习笔记(五) indigo computer vision

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  10. Typescript 学习笔记五:类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

随机推荐

  1. react native android 编译

    修改 Maven 仓库地址 React Native 在初始化时会从 jcenter.binary.com 这个地方下载一些东西,网上搜索了一下,好像是在下载 Maven 相关的依赖. 针对全局进行修 ...

  2. python 读不同编码的文本,传递一个可选的encoding 参数给open() 函数

    文件的读写操作默认使用系统编码,可以通过调用sys.getdefaultencoding() 来得到.在大多数机器上面都是utf-8 编码.如果你已经知道你要读写的文本是其他编码方式,那么可以通过传递 ...

  3. Python:键盘输入input

    从键盘读入数据 >>> num=input('利润是:') 利润是:55 >>>

  4. Linux服务器---安装squid

    安装squid proxy就是软件代理或者代理服务器,而squid就是一种常用的proxy服务 1.安装squid [root@localhost wj]# rpm -qa | grep squid ...

  5. Linux服务器---基础设置

    Centos分辨率      virtualbox里新安装的Centos 7 的分辨率默认的应该是800*600. 如果是‘最小化安装’的Centos7 进入的就是命令模式 .如果安装的是带有GUI的 ...

  6. 手撕vue-cli配置——webpack.base.conf.js篇

    在开始写webpack.base.conf.js(简称base)之前,我们先来看一下vue-loader.conf.js这个文件,毕竟在base中我们还会用到: 'use strict' //引入前一 ...

  7. 2018-2019-1 20189218《Linux内核原理与分析》第四周作业

    构造简单的Linux内核 显然用实验楼配好的环境做这个实验太简单了,按照没有困难制造困难也要上的原则,在自己的64位虚拟机上做这个实验. 按照课本(视频)上的步骤一直做下去,到编译生成init时出现了 ...

  8. 按时间间隔生成cron表达式

    cron表达式是使用任务调度经常使用的表达式了.对于通常的简单任务,我们只需要一条cron表达式就能满足.但是有的时候任务也可以很复杂. 最近我遇到了一个问题,一条任务在开始的时候要触发A方法,在结束 ...

  9. UVa 12627 Erratic Expansion - 分治

    因为不好复制题目,就出给出链接吧: Vjudge传送门[here] UVa传送门[here] 请仔细看原题上的那幅图,你会发现,在时间t(t > 0),当前的气球构成的一幅图,它是由三个时间为( ...

  10. BZOJ 2141 排队(树状数组套treap)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2141 题意:给出一个数列A,每次交换两个数的位置.输出交换后逆序对的个数. 思路:首先, ...