当前位置:   article > 正文

Flutter之基础组件详解Widget、MaterialApp、Scaffold、Container、Text、Image、ClipOval、ListView...持续更新中_flutter scaffold ,container和sidedbox区别

flutter scaffold ,container和sidedbox区别

目录

目录

一、根组件Widget

二、顶层组件MaterialApp

三、基础布局组件Scaffold

四、容器组件Container

五、文字组件Text

六、图片组件Image

七、圆形裁切组件ClipOval

八、ListView组件



一、根组件Widget

简介:Widget是所有组件的基类 所有组件都继承自它

要想自定义组件必须继承下边两个类中的其中一个:

1️⃣ StatelessWidget:无状态组件,状态不可变。

2️⃣ StatefulWidget:有状态组件,持有的状态可能在widget生命周期改变。

二、顶层组件MaterialApp

简介:MaterialApp是一个方便的widget,它封装了应用程序实现Material Design所需要的一个Widget。

一般作为顶层的Widget用

常用属性:

home(主页)

title(标题)

color(颜色)

theme(主题)

routes(路由)

...

三、基础布局组件Scaffold

简介:Scaffold是Material Design布局机构的基本实现,此类提供了用于显示drawer、snackbar和底部sheet的API 一般和MaterialApp一起使用。

常用属性:

appBar(显示在界面顶部的一个AppBar)

body(当前界面所显示的主要内容 Widget)

Drawer(抽屉菜单控件)

...

四、容器组件Container

简介:Container是一个容器组件也叫布局组件(可以理解为前端的div,块级元素),负责布局、绘画、定位和大小

常用属性:

属性名类型说明
key

Key

Container唯一表示符,用于查找更新

height

Double

设置Container容器的高度,设置为double.infinity可以强制在高度上撑满
width

Double

设置Container容器的宽度,设置为double.infinity可以强制在宽度上撑满,不设置,则根据child和父节点两者一起布局

decoration

Decoration

背景样式,一般可定义为BoxDecoration,里边有color属性,

设置背景颜色;border:边框样式,里边有Border.all()方法,可以添加color设置边框颜色;

gradient:设置背景颜色渐变 (案例:设置线性渐变):

gradient: LinearGradient(begin: Alignment.bottomCenter,end: Alignment.topCenter,colors: [Colors.black, Colors.yellow,], );

设置阴影:

boxShadow: [BoxShadow(color: Color.fromRGBO(69, 91, 99, 0.1000), offset: Offset(0, 16), blurRadius: 28)],

注:boxShadow与css的关系:

css:

box-shadow: 0px 8px 28px 0px rgba(60,70,74,0.3);

boxShadow:

boxShadow: [BoxShadow(offset: Offset(0, 8), blurRadius: 28,spreadRadius: 0,color: Color.fromRGBO(60, 70, 74, 0.3),)],

borderRadius

BorderRadius

可以设置Container边框圆角

BorderRadius.all(Radius.circular())方法;

BorderRadius.circular()方法都可以来设置边框圆角

当然也可以设置圆角的图片(也可以使用ClipOval组件来实现圆角)

BoxDecoration中有一个image的属性 使用方法:

@override

Widget build(BuildContext context) {

  return Center(

    child: Container(

      width: 500,

      height: 500,

      decoration: BoxDecoration(

        color: Colors.yellow,

          borderRadius: BorderRadius.circular(250),

          image:DecorationImage(

              image: NetworkImage(imageUrl),

              fit: BoxFit.cover

          )

      ),

    )

  );

}

margin

EdgeInsets

外边距,调用EdgeInsets.all()方法或EdgeInsets.fromLTRB(left, top, right, bottom)方法来设置参数。
padding

EdgeInsets

内边距,调用EdgeInsets.all()方法或EdgeInsets.fromLTRB(left, top, right, bottom)方法来设置参数。

transform

Matrix4

位移:调用Matrix4.translationValues(x, y, z);

旋转:Matrix4.rotationZ(-0.5)//整数是顺时针? 负数是逆时针?;

缩放:Matrix4.diagonal3Values(x, y, z);

alignment

Alignment

元素显示位置:

Alignment.center居中显示;

Alignment.topRight 右上显示;

...

五、文字组件Text

简介:Text是文本组件,顾名思义Text组件就是用来显示一串文字的。

常用属性:

属性名

类型

说明

textAlign

TextAlign

文本显示方式:

textAlign.center 居中对齐;

textAlign.right 右对齐;

textAlign.left 左对齐;

textAlign.justify 两端对齐;

overflow

TextOverFlow

一行文字溢出到多行的时候的处理方式:

TextOverflow.ellipsis:省略号;

TextOverflow.clip:裁剪;

TextOverflow.fade 渐隐;

maxLinesint文字最大行数限制

textScaleFactor

double字体显示倍率
style

TextStyle

字体样式:

fontSize:double 字体大小;

color:Colors.** 字体颜色;

fontWeight:FontWeight.w800 字体加粗;

fontStyle:FontStyle.italic 字体倾斜;

decoration:TextDecoration.lineThrough 字体添加横线;

decorationColor:Colors.** 字体横线颜色;

decorationStyle:TextDecorationStyle.dashed 字体横线变虚线;

letterSpacing:double 字间距

六、图片组件Image

简介:Image是照片组件,顾名思义Image组件就是用来显示图形的组件。

常用属性:

属性名

类型

说明

Image.network

Image.asset

从网络加载图片

从本地加载图片

alignment:图片对齐方式:

Alignment.center居中显示

...

fit(常用)

BoxFit

Fit属性用来控制图片的拉伸和挤压,这都是根据父容器来的。

BoxFit.fill:全图显示,图片会被拉伸,并充满父容器;

BoxFit.contain:全图显示,显示原比例,可能会有缝隙;

BoxFit.cover(常用):显示可能拉伸,可能裁切,充满(图片要充满整个容器,还不变形。);

BoxFit.fitWidth:宽度充满(横向充满),显示可能拉伸,可能裁切;

BoxFit.fitHight:高度充满(竖向充满),显示可能拉伸,可能裁切;

BoxFit.scaleDown:效果和contain差不多,但是此属性不允许显示超过源图片大小,可小不可大。

color

colorBlendMode

Color

BlendMode

用来设置图片背景颜色,通常和colorBlendMode一起使用,这样可以是图片颜色和背景色混合。

repeat

ImageRepeat

平铺照片:

ImageRepeat.repeat:横向和纵向都进行重复,知道铺满整个画布

ImageRepeat.repeatX:X轴平铺

ImageRepeat.repeatY:Y轴平铺

widthdouble一般和ClipOval一起使用才能看到效果
hightdouble

一般和ClipOval一起使用才能看到效果,就是下边这个组件。?

PS:Image组件引用本地图片方法:

1️⃣:在根目录创建文件夹images->2.0x&3.0x&4.0x 如图:

2️⃣:在pubspec.yaml文件引入当前图片

3️⃣:在项目中引入:ps:这里使用了插件flutter-img-sync,直接引入r.dart文件(这个文件里封装好了路径)

  1. import 'package:flutter/material.dart';
  2. import 'r.dart';
  3. void main()=>runApp(MyApp());
  4. class MyApp extends StatelessWidget{
  5. @override
  6. Widget build(BuildContext context) {
  7. return MaterialApp(
  8. debugShowCheckedModeBanner: false,
  9. home: Scaffold(
  10. appBar: AppBar(
  11. title: Text('flutter title'),
  12. ),
  13. body: HomeContent(),
  14. ),
  15. );
  16. }
  17. }
  18. class HomeContent extends StatelessWidget {
  19. @override
  20. Widget build(BuildContext context) {
  21. return new Center(
  22. child: Container(
  23. width: 300,
  24. height: 300,
  25. decoration: BoxDecoration(
  26. color: Colors.yellow,
  27. image: DecorationImage(image: AssetImage(R.assetsImg1),fit: BoxFit.cover),
  28. borderRadius: BorderRadius.circular(150)
  29. ),
  30. ),
  31. );
  32. }
  33. }

r.dart文件:

  1. class R {
  2. /// ![](http://127.0.0.1:9813/assets/img/1.gif)
  3. static final String assetsImg1 = 'assets/img/1.gif';
  4. }

七、圆形裁切组件ClipOval

简介:ClipOval是对一个图片进行圆形裁切,是单独的一个组件。

使用方法:

  1. import 'package:flutter/material.dart';
  2. void main()=>runApp(MyApp());
  3. class MyApp extends StatelessWidget{
  4. @override
  5. Widget build(BuildContext context) {
  6. return MaterialApp(
  7. home: Scaffold(
  8. appBar: AppBar(
  9. title: Text('flutter title'),
  10. ),
  11. body: ClipOvalContent(),
  12. ),
  13. );
  14. }
  15. }
  16. class HomeContent extends StatelessWidget {
  17. //var imageUrl = 'https://img-blog.csdnimg.cn/img_convert/30536829d07d831358f3670aa0f1f08c.png';
  18. final imageUrl = 'https://tvax4.sinaimg.cn/large/006Xzox4ly1g18bru6qhbg309u09kgnb.gif';
  19. @override
  20. Widget build(BuildContext context) {
  21. return Center(
  22. child: Container(
  23. width: 500,
  24. height: 500,
  25. decoration: BoxDecoration(
  26. color: Colors.yellow,
  27. borderRadius: BorderRadius.circular(250),
  28. image:DecorationImage(
  29. image: NetworkImage(imageUrl),
  30. fit: BoxFit.cover
  31. )
  32. ),
  33. )
  34. );
  35. }
  36. }
  37. //圆形裁切
  38. class ClipOvalContent extends StatelessWidget {
  39. final imageUrl = 'https://tvax4.sinaimg.cn/large/006Xzox4ly1g18bru6qhbg309u09kgnb.gif';
  40. @override
  41. Widget build(BuildContext context) {
  42. return Center(
  43. child: Container(
  44. child: ClipOval(
  45. child: Image.network(
  46. imageUrl,
  47. height: 300,
  48. width: 300,
  49. fit: BoxFit.cover,
  50. ),
  51. ),
  52. ),
  53. );
  54. }
  55. }

八、ListView组件

简介:列表布局使我们项目开发中最常见的一种布局方式,Flutter中我们通过ListView来定义列表项,支持垂直和水平方向展示。通过一个属性就可以控制列表的显示方向。列表有以下几类:

  • 1、垂直列表

  • 2、垂直图文列表

  • 3、水平列表

  • 4、动态列表

  • 5、矩阵式列表

1️⃣:ListView常用参数:

属性名

类型

说明

scrollDirection

Axis

Axis.horizontal水平列表

Axis.vertical垂直列表

(默认垂直列表)

padding

EdgeInsetsGeometry

内边距
resolvebool组件反向顺序
children

List<Widget>

列表元素

2️⃣:ListTile常用参数:

简介:ListTile通常用于在Flutter中填充ListView。一般实例化一个ListView都会在children中实现多个ListTile

例如:

  1. class HomeContent extends StatelessWidget {
  2. @override
  3. Widget build(BuildContext context) {
  4. return ListView(
  5. children: <Widget>[
  6. ListTile(
  7. title: Text('小标题'),
  8. subtitle: Text('二级小标题'),
  9. leading: Image.network(
  10. 'https://tvax4.sinaimg.cn/large/006Xzox4ly1g18bru6qhbg309u09kgnb.gif',
  11. fit: BoxFit.cover,
  12. ),
  13. trailing: Icon(Icons.keyboard_arrow_right),
  14. dense: true,
  15. contentPadding: EdgeInsets.all(0),
  16. selected: true,
  17. //点击事件 onTap 为单击,onLongPress 为长按
  18. onTap: (){
  19. print('123');
  20. },
  21. onLongPress: (){
  22. print('456');
  23. },
  24. ),
  25. ListTile(
  26. title: Text('标题'),
  27. subtitle: Text('二级标题'),
  28. leading: Image.network(
  29. 'https://tvax4.sinaimg.cn/large/006Xzox4ly1g18bru6qhbg309u09kgnb.gif',
  30. fit: BoxFit.cover,
  31. ),
  32. onTap: (){
  33. print('131313');
  34. },
  35. trailing: Icon(Icons.keyboard_arrow_up),
  36. ),
  37. ListTile(
  38. title: Text('标题'),
  39. subtitle: Text('二级标题禁用'),
  40. leading: Image.network(
  41. 'https://tvax4.sinaimg.cn/large/006Xzox4ly1g18bru6qhbg309u09kgnb.gif',
  42. fit: BoxFit.cover,
  43. ),
  44. trailing: Icon(Icons.keyboard_arrow_up),
  45. onTap: (){
  46. print('123');
  47. },
  48. enabled: false,
  49. ),
  50. ],
  51. );
  52. }
  53. }

效果:

属性名

类型

说明

title

Widget

title:标题,可接受任何组件参数,一般为文本小部件
subtitle

Widget

subtitle:副标题,功能同上

dense

bool

可以使文字变的更小,可参考图上第一个和第二个列表的区别
leading

Widget

在列表的开头添加一个组件。这通常是一个图标或者是图像。如上图

trailing

Widget

在列表的末尾添加一个组件。如上。一般可以放一个箭头来做点击事件等等~ 如上图

也可以使用flutter内置的Icon组件

contentPadding

EdgeInsets

设置内容内边距,默认是16。

selected

bool

在item中设置为true的时候,那么文本颜色将设置为app主体的主颜色

onTap(){};

GestureTap

点击事件,onTap为单击item要触发的事件

onLongPress(){};

GestureLongPress

点击事件,onTap为长摁item要触发的事件

enablebool设置为false:禁用点击事件 同时item置灰

Icon

StatelessWidget

内置图标组件:一般在leading或trailing中使用。

如trailing: Icon(Icons.tag_faces)

常用属性:

color:设置图标颜色;

size:设置图标大小

1️⃣:垂直列表demo

  1. import 'package:flutter/material.dart';
  2. import 'package:flutter/widgets.dart';
  3. import 'r.dart';
  4. void main() => runApp(MyApp());
  5. class MyApp extends StatelessWidget {
  6. @override
  7. Widget build(BuildContext context) {
  8. return MaterialApp(
  9. home: Scaffold(
  10. appBar: AppBar(
  11. title: Container(
  12. child: Text(
  13. '设置',
  14. style: TextStyle(
  15. fontSize: 25.0,
  16. color: Colors.black,
  17. fontWeight: FontWeight.bold,
  18. ),
  19. ),
  20. padding: EdgeInsets.fromLTRB(0, 0, 320, 0),
  21. ),
  22. backgroundColor: Colors.white,
  23. ),
  24. body: SettingContent(),
  25. ),
  26. theme: ThemeData.light(),
  27. debugShowCheckedModeBanner: false,
  28. );
  29. }
  30. }
  31. class SettingContent extends StatelessWidget {
  32. @override
  33. Widget build(BuildContext context) {
  34. return ListView(
  35. scrollDirection: Axis.vertical,
  36. children: <Widget>[
  37. Image.asset(R.assetsImg2,fit: BoxFit.cover,),
  38. ListTile(
  39. title: Text(
  40. '王洪川',
  41. style: TextStyle(fontSize: 20),
  42. ),
  43. subtitle: Text('Apple ID、iClound、iTunes与App Store'),
  44. leading: ClipOval(
  45. child: Image.asset(R.assetsImg1),
  46. ),
  47. trailing: Icon(Icons.chevron_right),
  48. ),
  49. Image.asset(R.assetsImg2,fit: BoxFit.cover,),
  50. ListTile(
  51. title: Text(
  52. '飞行模式',
  53. ),
  54. leading: Icon(Icons.flight,color: Colors.green,),
  55. trailing: Icon(Icons.airplanemode_inactive),
  56. ),
  57. ListTile(
  58. title: Text(
  59. 'Wi-Fi',
  60. ),
  61. leading: Icon(Icons.wifi,color: Colors.blueAccent,),
  62. trailing: Icon(Icons.chevron_right),
  63. ),
  64. ListTile(
  65. title: Text(
  66. '蓝牙',
  67. ),
  68. leading: Icon(Icons.bluetooth,color: Colors.blueAccent),
  69. trailing: Icon(Icons.chevron_right),
  70. ),
  71. ListTile(
  72. title: Text(
  73. '蜂窝移动网络',
  74. ),
  75. leading: Icon(Icons.signal_cellular_connected_no_internet_4_bar,size: 25,color: Colors.amber,),
  76. trailing: Icon(Icons.chevron_right),
  77. ),
  78. ListTile(
  79. title: Text(
  80. '个人热点',
  81. ),
  82. leading: Icon(Icons.wifi_tethering,color: Colors.green,),
  83. trailing: Icon(Icons.chevron_right),
  84. ),
  85. ListTile(
  86. title: Text(
  87. 'VPN',
  88. ),
  89. leading: Icon(Icons.vpn_key,color: Colors.purple,),
  90. trailing: Icon(Icons.chevron_right),
  91. ),
  92. Image.asset(R.assetsImg2,fit: BoxFit.cover,),
  93. ListTile(
  94. title: Text(
  95. '通知',
  96. ),
  97. leading: Icon(Icons.info,color: Colors.red,),
  98. trailing: Icon(Icons.chevron_right),
  99. ),
  100. ListTile(
  101. title: Text(
  102. '声音与触感',
  103. ),
  104. leading: Icon(Icons.volume_up,color: Colors.red,),
  105. trailing: Icon(Icons.chevron_right),
  106. ),
  107. ListTile(
  108. title: Text(
  109. '勿扰模式',
  110. ),
  111. leading: Icon(Icons.airline_seat_individual_suite,color: Colors.blue,),
  112. trailing: Icon(Icons.chevron_right),
  113. ),
  114. ListTile(
  115. title: Text(
  116. '屏幕使用时间',
  117. ),
  118. leading: Icon(Icons.access_time,color: Colors.blue,),
  119. trailing: Icon(Icons.chevron_right),
  120. ),
  121. Image.asset(R.assetsImg2,fit: BoxFit.cover,),
  122. ListTile(
  123. title: Text(
  124. '通用',
  125. ),
  126. leading: Icon(Icons.settings_applications,color: Colors.grey,),
  127. trailing: Icon(Icons.chevron_right),
  128. ),
  129. ListTile(
  130. title: Text(
  131. '控制中心',
  132. ),
  133. leading: Icon(Icons.tune,color: Colors.grey,),
  134. trailing: Icon(Icons.chevron_right),
  135. ),
  136. ListTile(
  137. title: Text(
  138. '显示与亮度',
  139. ),
  140. leading: Icon(Icons.slideshow,color: Colors.blue,),
  141. trailing: Icon(Icons.chevron_right),
  142. ),
  143. ListTile(
  144. title: Text(
  145. '墙纸',
  146. ),
  147. leading: Icon(Icons.wallpaper,color: Colors.lightBlue,),
  148. trailing: Icon(Icons.chevron_right),
  149. ),
  150. ],
  151. );
  152. }
  153. }

效果图:

1️⃣:水平列表demo

  1. import 'package:flutter/material.dart';
  2. import 'package:flutter/widgets.dart';
  3. import 'r.dart';
  4. void main() => runApp(MyApp());
  5. class MyApp extends StatelessWidget {
  6. @override
  7. Widget build(BuildContext context) {
  8. return MaterialApp(
  9. home: Scaffold(
  10. appBar: AppBar(
  11. title: Container(
  12. child: Text(
  13. '水平列表',
  14. style: TextStyle(
  15. fontSize: 25.0,
  16. color: Colors.black,
  17. fontWeight: FontWeight.bold,
  18. ),
  19. ),
  20. ),
  21. backgroundColor: Colors.white,
  22. ),
  23. body: SettingContent(),
  24. ),
  25. theme: ThemeData.light(),
  26. debugShowCheckedModeBanner: false,
  27. );
  28. }
  29. }
  30. class SettingContent extends StatelessWidget {
  31. @override
  32. Widget build(BuildContext context) {
  33. return Container(
  34. height: 300,
  35. padding: EdgeInsets.fromLTRB(0, 15, 0, 0),
  36. child: ListView(
  37. scrollDirection: Axis.horizontal,
  38. children: <Widget>[
  39. Container(
  40. child: Image.network(
  41. "http://pic.rmb.bdstatic.com/f54083119edfb83c4cfe9ce2eeebc076.jpeg",
  42. fit: BoxFit.cover,
  43. ),
  44. width: 600,
  45. ),
  46. Container(
  47. child: Image.network(
  48. "http://www.leawo.cn/attachment/201404/16/1433365_1397624557Bz7w.jpg",
  49. fit: BoxFit.cover),
  50. width: 600,
  51. ),
  52. Container(
  53. child: Image.network(
  54. "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1567069501095&di=45d8007235a116c3bebd7000642dbefb&imgtype=0&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fblog%2F201503%2F27%2F20150327133834_JQWKZ.jpeg",
  55. fit: BoxFit.cover),
  56. width: 600,
  57. ),
  58. Container(
  59. child: Image.network(
  60. "http://img02.tooopen.com/Downs/images/2010/7/14/sy_20100714115734724071.jpg",
  61. fit: BoxFit.cover),
  62. width: 600,
  63. ),
  64. Container(
  65. child: Image.network(
  66. "http://static01.lvye.com/portal/201604/28/093110pb7151d134r1rvet.jpg",
  67. fit: BoxFit.cover),
  68. width: 600,
  69. ),
  70. ],
  71. ),
  72. );
  73. }
  74. }

效果图:

图片太大了。。转存了

https://www.chuanzigeblog.com/upload/2019/7/bbb20190829145343279.gif

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/289701
推荐阅读
相关标签
  

闽ICP备14008679号