热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Flutter之Container用法详解

转:https:www.jianshu.compb837c1b0da6f最近开始接触Flutter,网上对Flutter评价很高,加上是

转:https://www.jianshu.com/p/b837c1b0da6f

最近开始接触Flutter,网上对Flutter评价很高,加上是谷歌这种大公司研发推广的,决定先入坑。

废话不多说,直奔主题!学习框架,首先要将里面常用控件熟练使用,后面可以逐步深入、究其原理。


前言

相关文章:Flutter学习目录

github地址:Flutter学习

文章结构


  • Color Property
  • Child Property
  • Alignment Property
  • Constraints Property
  • Margin Property
  • Padding Property
  • Decoration Property
  • ForegroundDecoration Property
  • Transform Property

介绍

Container类似于iOS中的UIView,具有绘制定位调整大小功能。通常用来装载其它子控件,假如Container没有子控件,它将自动填充整个屏幕;反之,会根据子控件大小,调整自身大小,从而达到自适应效果。

注意:

使用Container时,通常要有一个父控件,一般情况下不单独使用Container。常用的父控件有Center widget、Padding Widget、Column Widget、Row Widget、Scaffold Widget。


一、Color Property

这个属性用于设置Container的背景颜色,类似于iOS中的UIView的backgroundColor。使用如下:


  • Colors Class

//Container颜色属性之Colors
class Color_Property_Colors extends StatelessWidget{@overrideWidget build(BuildContext context) {return Center(child: Container(//color: Colors.green,//正常颜色//color:Colors.green[200],//带有阴影(相当于是透明度)color: Colors.green.shade200,//同上),);}
}

呈现效果如下:

 

图1 Container之Colors属性


  • Color Class

//Container颜色属性之Color
class Color_Property_Color extends StatelessWidget{@overrideWidget build(BuildContext context) {return Center(child: Container(//color: Color(0xFFFFFFFF),//一定是8位,否则报错//color: Color.fromARGB(255, 66, 165, 245),color: Color.fromRGBO(66, 165, 245, 1.0),//作用同上),);}
}

呈现效果如下:

 

图2 Container之Color属性

注意:

1、使用8位16进制而不是6位
2、.fromARGB含义
A = Alpha or opacity, R = Red, G = Green, B = Blue
3、.fromRGBO含义
R = Red, G = Green, B = Blue, O = Opacity


二、Child Property

如前言所述,如果Container里面没有子控件,它就会填充整个屏幕;如果有子控件,Container就会自动适应子控件大小
另外,Container只能容纳一个子控件,如果想容纳更多的子控件,可以将子控件设置为Row、Column、Stack(这三个子控件都有一个children属性)


  • 添加子控件

//Container属性之Child
class Child_Property extends StatelessWidget{@overrideWidget build(BuildContext context) {return Center(child: Container(color: Color.fromRGBO(66, 165, 245, 1.0),child: Text("Flutter Cheatsheet"),),);}
}

呈现效果如下:

 

图3 添加子控件


三、Alignment Property

Alignment属性主要是针对于Container内部的子控件布局。
主要有以下几个属性:Alignment、FractionalOffset、AlignmentDirectional


  • Alignment
    代码如下:

//Container属性之Alignment
class Alignment_Property extends StatelessWidget{@overrideWidget build(BuildContext context) {return Center(child: Container(color: Color.fromARGB(255, 66, 165, 245),child: Text("Flutter Cheatsheet",style: TextStyle(fontSize: 30.0),),//不加这句话,Container会自适应child大小;加上以后会充满屏幕//alignment: Alignment(0.0, 0.0),alignment: Alignment.center,//等价于上面),);}
}

效果如下:

 

图4 Container属性之Alignment

Alignment坐标系图如下:

 

图5 Alignment坐标系

常用等价属性:
Alignment.bottomCenter 对应 Alignment(0.0, 1.0)
Alignment.bottomLeft 对应 Alignment(-1.0, 1.0)
Alignment.bottomRight 对应 Alignment(1.0, 1.0)
Alignment.center 对应 Alignment(0.0, 0.0)
Alignment.centerLeft 对应 Alignment(-1.0, 0.0)
Alignment.centerRight 对应 Alignment(1.0, 0.0)
Alignment.topCenter 对应 Alignment(0.0, -1.0)
Alignment.topLeft 对应 Alignment(-1.0, -1.0)
Alignment.topRight 对应 Alignment(1.0, -1.0)


  • FractionalOffset
    这个属性跟上面讲的Alignment非常相似,唯一的不同就是坐标系:
    Alignment坐标系是X:-1.0--1.0;Y:-1.0--1.0,
    FractionalOffset坐标系是X:0.0--1.0,Y:0.0--1.0。

FractionalOffset坐标系图如下:

图6 FractionalOffset坐标系

代码如下:

//Container属性之FractionalOffset
class Alignment_FractionalOffset extends StatelessWidget{@overrideWidget build(BuildContext context) {return Center(child: Container(color: Color.fromARGB(255, 66, 165, 245),child: Text("Flutter Cheatsheet",style: TextStyle(fontSize: 30.0),),//不加这句话,Container会自适应child大小;加上以后会充满屏幕//alignment: FractionalOffset(0.5, 0.5),alignment: FractionalOffset.center,//等价于上面),);}
}

常用等价属性如下
FractionalOffset.bottomCenter 对应 FractionalOffset(0.5, 1.0)
FractionalOffset.bottomLeft 对应 FractionalOffset(0.0, 1.0)
FractionalOffset.bottomRight 对应 FractionalOffset(1.0, 1.0)
FractionalOffset.center 对应 FractionalOffset(0.5, 0.5)
FractionalOffset.centerLeft 对应 FractionalOffset(0.0, 0.5)
FractionalOffset.centerRight 对应 FractionalOffset(1.0, 0.5)
FractionalOffset.topCenter 对应 FractionalOffset(0.5, 0.0)
FractionalOffset.topLeft 对应 FractionalOffset(0.0, 0.0)
FractionalOffset.topRight 对应 FractionalOffset(1.0, 0.0)


  • AlignmentDirectional
    说到这个属性,就要提到一个小插曲:
    网上说AlignmentDirectional有2个坐标系,是因为TextDirection.ltr和TextDirection.rtl,但是经过本人的亲身实验,这种观点是不对的,不知道是不是由于官方官方框架更新的原。
    最终结论:这个属性跟Alignment用法是完全一样(既然完全一样,何必多此一举呢?)。

坐标系图如下:

 

图7 AlignmentDirectional坐标系

代码如下:

//Container属性之AlignmentDirectional
class Alignment_AlignmentDirectional extends StatelessWidget{@overrideWidget build(BuildContext context) {return Center(child: Container(color: Color.fromARGB(255, 66, 165, 245),child: Text("Flutter",style: TextStyle(fontSize: 15.0),//textDirection: TextDirection.ltr,//正常,从左向右(不影响alignment)textDirection: TextDirection.ltr,//从右向左(不影响alignment)),//不加这句话,Container会自适应child大小;加上以后会充满屏幕alignment:AlignmentDirectional(-1.0, 1.0),//alignment: AlignmentDirectional.bottomStart,//等价于上面),);}
}

常用等价属性:
AlignmentDirectional.bottomCenter 对应 AlignmentDirectional(0.0, 1.0)
AlignmentDirectional.bottomEnd 对应 AlignmentDirectional(1.0, 1.0)
AlignmentDirectional.bottomStart 对应 AlignmentDirectional(-1.0, 1.0)
AlignmentDirectional.center 对应 AlignmentDirectional(0.0, 0.0)
AlignmentDirectional.centerEnd 对应 AlignmentDirectional(1.0, 0.0)
AlignmentDirectional.centerStart 对应 AlignmentDirectional(-1.0, 0.0)
AlignmentDirectional.topCenter 对应 AlignmentDirectional(0.0, -1.0)
AlignmentDirectional.topEnd 对应 AlignmentDirectional(1.0, -1.0)
AlignmentDirectional.topStart 对应 AlignmentDirectional(-1.0, -1.0)


四、Constraints Property

布局属性,主要讲的是怎么确定控件的大小;其中经常使用的就是BoxConstraint。BoxConstraint包含minWidth、maxWidth、minHeight、maxHeight,详细介绍如下:


  • Container无子控件(场景1)
    代码如下:

//Container属性之Constraints Property
class Constraints_Property extends StatelessWidget{@overrideWidget build(BuildContext context) {return Center(child: Container(color: Color.fromARGB(255, 66, 165, 245),alignment: AlignmentDirectional(0.0, 0.0),child: Container(color: Colors.green,constraints: BoxConstraints(maxHeight: 300,maxWidth: 200,minWidth: 150,minHeight: 150,),),),);}
}

呈现效果如下:

 

图8 Container之Constraints无子控件

前面说过如果Container没有子控件,Container将填充整个屏幕,但是这里设置maxHeight、maxWidth。


  • Container有子控件(场景2)
    代码如下:

//Container属性之Constraints(有子控件)
class Constraints_Property_HasChild extends StatelessWidget{@overrideWidget build(BuildContext context) {return Center(child: Container(color: Color.fromARGB(255, 66, 165, 245),alignment: AlignmentDirectional(0.0, 0.0),child: Container(color: Colors.green,child: Text("Flutter"),constraints: BoxConstraints(maxHeight: 300,maxWidth: 200,minWidth: 150,minHeight: 150,),),),);}
}

呈现效果如下:

 

图9 Container之Constraints有子控件

这里虽然有一个子控件,Container会调整自身大小来适应内部子控件,但是由于设置了min-width和min-height。所以Container不会完全和子控件一样大,除非子控件尺寸大于min-width和min-height。

尝试更改子控件大小,代码如下:

//Container属性之Constraints(有子控件)
class Constraints_Property_HasChild extends StatelessWidget{@overrideWidget build(BuildContext context) {return Center(child: Container(color: Color.fromARGB(255, 66, 165, 245),alignment: AlignmentDirectional(0.0, 0.0),child: Container(color: Colors.green,//child: Text("Flutter"),child: Text("Flutter Cheatsheet Flutter Cheatsheet"),constraints: BoxConstraints(maxHeight: 300,maxWidth: 200,minWidth: 150,minHeight: 150,),),),);}
}

呈现效果图如下:

 

图10 Container之Constraints有子控件

 

从上面这张图可以看出Container不能超出max-width和max-height。


  • Container有子控件(场景3)
    当Container有子控件,我们想让Container不去适应子控件,而是充满整个屏幕或父控件,怎么办?
    答案就是使用BoxConstraints.expand()。
    代码如下:

//Container属性之Constraints(有子控件、充满整个屏幕)
class Constraints_Property_HasChild_AllScreen extends StatelessWidget{@overrideWidget build(BuildContext context) {return Center(child: Container(color: Color.fromARGB(255, 66, 165, 245),alignment: AlignmentDirectional(0.0, 0.0),child: Container(color: Colors.green,//child: Text("Flutter"),child: Text("Flutter"),constraints: BoxConstraints.expand(),),),);}
}

呈现效果如下:

 

图11 Container之Constraints有子控件

此时发现Container是充满整个屏幕的,我们也可以限制充满屏幕大小,比如说1/2宽、1/3高等。


五、Margin Property

跟前端的css类似,这个Margin指的是相邻控件之间的距离,主要是用EdgeInsets。


  • EdgeInsets.all()
  • EdgeInsets.symmetric()
  • EdgeInsets.fromLTRB()
  • EdgeInsets.only()

详细如下:


  • EdgeInsets.all()
    代码如下:

//EdgeInsets.all()
class Margin_Property_EdgeInsets_all extends StatelessWidget{@overrideWidget build(BuildContext context) {return Center(child: Container(color: Color.fromARGB(255, 66, 165, 245),alignment: AlignmentDirectional(0.0, 0.0),child: Container(color: Colors.green,margin: EdgeInsets.all(20.0),),),);}
}

呈现效果如下:

 

图12 Margin之EdgeInsets.all


  • EdgeInsets.symmetric()
    这个主要用于添加垂直和水平方向上的约束。
    代码如下:

//EdgeInsets.symmetric()
class Margin_Property_EdgeInsets_symmetric extends StatelessWidget{@overrideWidget build(BuildContext context) {return Center(child: Container(color: Color.fromARGB(255, 66, 165, 245),alignment: AlignmentDirectional(0.0, 0.0),child: Container(color: Colors.green,margin: EdgeInsets.symmetric(vertical: 20.0,horizontal: 50.0,),),),);}
}

呈现效果如下:

 

图13 Margin之EdgeInsets. symmetric


  • EdgeInsets.fromLTRB()
    这个主要设置left, top, right,bottom边距。
    代码如下:

//EdgeInsets.fromLTRB()
class Margin_Property_EdgeInsets_fromLTRB extends StatelessWidget{@overrideWidget build(BuildContext context) {return Center(child: Container(color: Color.fromARGB(255, 66, 165, 245),alignment: AlignmentDirectional(0.0, 0.0),child: Container(color: Colors.green,margin: EdgeInsets.fromLTRB(20.0, 30.0, 40.0, 50.0)),),);}
}

呈现效果:

 

图14 Margin之EdgeInsets. fromLTRB


  • EdgeInsets.only()
    用于设置哪些是非零的,不设置默认是零。
    代码如下:

//EdgeInsets.only()
class Margin_Property_EdgeInsets_only extends StatelessWidget{@overrideWidget build(BuildContext context) {return Center(child: Container(color: Color.fromARGB(255, 66, 165, 245),alignment: AlignmentDirectional(0.0, 0.0),child: Container(color: Colors.green,margin: EdgeInsets.only(left: 20.0,bottom: 40.0,top: 50.0,)),),);}
}

呈现效果如下:

 

图15 Margin之EdgeInsets.only


六、Padding Property

这个用于设置主控件内部子控件之间的间距。和Margin一样,利用到EdgeInsets。
代码如下:

//EdgeInsets.all
class Padding_Property_EdgeInsets_all extends StatelessWidget{@overrideWidget build(BuildContext context) {return Center(child: Container(color: Color.fromARGB(255, 66, 165, 245),alignment: AlignmentDirectional(0.0, 0.0),child: Container(margin: EdgeInsets.only(left: 20.0,bottom: 40.0,top: 50.0,),padding: EdgeInsets.all(10.0),//设置内部Text控件边距color: Colors.green,child: Text("Flutter Cheatsheet"),//不设置这个Container和子控件一样大小、这样margin设置也就没有意义了constraints: BoxConstraints.expand(),),),);}
}

呈现效果如下:

 

图16 Padding之EdgeInsets.all


七、Decoration Property


  • BoxDecoration Class
  • FlutterLogoDecoration Class
  • ShapeDecoration Class
  • UnderlineTabIndicator Class
    由于涉及篇幅较长,后续会重新文章详细讲解,敬请关注。

八、ForegroundDecoration Property


  • BoxDecoration Class
  • FlutterLogoDecoration Class
  • ShapeDecoration Class
  • UnderlineTabIndicator Class
    由于涉及篇幅较长,后续会重新文章详细讲解,敬请关注

九、Transform Property

在Container属性中添加transform属性,并使用Matrix类设置transform的值,即可达到各种变换效果,代码如下:

//Transform Property
class Transform_Property extends StatelessWidget{@overrideWidget build(BuildContext context) {return Container(color: Color.fromARGB(255, 66, 165, 245),alignment: AlignmentDirectional(0.0, 0.0),child: Container(padding: EdgeInsets.all(40.0),color: Colors.green,child: Text("Flutter Cheatsheet"), transform: Matrix4.rotationZ(0.5),),);}
}

效果图如下:

 

图17 Transform Property



作者:huoshe2019
链接:https://www.jianshu.com/p/b837c1b0da6f
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。


推荐阅读
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 先上图引入插件在pubspec.yaml中引入charts_flutter插件使用的时候版本到0.6.0,插件地址:https:github.comgooglecharts使用插件 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • Oracle10g备份导入的方法及注意事项
    本文介绍了使用Oracle10g进行备份导入的方法及相关注意事项,同时还介绍了2019年独角兽企业重金招聘Python工程师的标准。内容包括导出exp命令、删用户、创建数据库、授权等操作,以及导入imp命令的使用。详细介绍了导入时的参数设置,如full、ignore、buffer、commit、feedback等。转载来源于https://my.oschina.net/u/1767754/blog/377593。 ... [详细]
  • 本文介绍了腾讯最近开源的BERT推理模型TurboTransformers,该模型在推理速度上比PyTorch快1~4倍。TurboTransformers采用了分层设计的思想,通过简化问题和加速开发,实现了快速推理能力。同时,文章还探讨了PyTorch在中间层延迟和深度神经网络中存在的问题,并提出了合并计算的解决方案。 ... [详细]
  • 本文整理了常用的CSS属性及用法,包括背景属性、边框属性、尺寸属性、可伸缩框属性、字体属性和文本属性等,方便开发者查阅和使用。 ... [详细]
  • 使用Flutternewintegration_test进行示例集成测试?回答首先在dev下的p ... [详细]
  • 人脸检测 pyqt+opencv+dlib
    一、实验目标绘制PyQT界面,调用摄像头显示人脸信息。在界面中,用户通过点击不同的按键可以实现多种功能:打开和关闭摄像头, ... [详细]
  • HTC EVO 4G+手机存储(SD卡)中各个文件夹功能说明(转载)
      HTCRider/X515E/EVO4G+手机存储(SD卡)中各个文件夹功能说明  HTCRider/X515E/EVO4G+  1、.android_s ... [详细]
  • 请修改resxmldefault_workspace.xml文件,添加如下代码:    launcher:packageName完整的包名    launcher:cla ... [详细]
author-avatar
eq2wq32wq
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有