Flutter 常用组件
🥰Flutter 常用组件🥰
🌟Text Widget文本组件的使用
import 'package:flutter/material.dart';
void main () => runApp(MyApp());
class MyApp extends StatelessWidget{
@override
Widget build(BuildContext context ){
return MaterialApp(
title:'Text widget',
home:Scaffold(
body:Center(
child:Text('hello Flutter, i like')
),
),
);
}
}
TextAlign属性
TextAlign属性就是文本的对齐方式
- center ———- 文本以居中的形式对齐
- left————– 文本以左对齐的方式对齐
- right————- 文本以右对齐的方式对齐
- start————- 文本以开始的位置对齐,类似left
- end ————– 文本以结尾处对齐,类似于right
child:Text(
'hello Flutter, i like',
textAlign: TextAlign.left,
)
maxLines属性
设置最多显示行数
child:Text(
'hello Flutter, i like',
textAlign: TextAlign.left,
maxLines: 1 // 最多显示一行
)
overflow属性
overflow属性是设置文本溢出的
- clip:直接切断,相当于css中hidden
- ellipsis:在后面显示省略号
- fade:溢出部分采用渐变消失的状态(是上线渐变消失))
child:Text(
'hello Flutter, i like',
textAlign: TextAlign.left,
maxLines: 1, // 最多显示一行
overflow: TextOverflow.ellipsis // 超出部分以省略号的形式出现
)
style属性
style的属性比较多,这里只演示部分【下面制作一个字体大小为25.0,颜色为蓝色,有下划线的,下划线颜色为黄色】
child:Text(
'hello Flutter, i like',
textAlign: TextAlign.left,
maxLines: 1, // 最多显示一行
overflow: TextOverflow.ellipsis, // 超出部分以省略号的形式出现
style: TextStyle(
fontSize: 25.0,
color: Colors.blue,
// color:Color.fromARGB(255, 255, 150, 150), // 颜色也可以用这种方式表示
decoration: TextDecoration.underline,
decorationStyle: TextDecorationStyle.solid,
decorationColor: Colors.yellow
),
)
更多属性资料 Flutter中文网 - 文本 Widget
⚡Container容器组件的使用
Container(容器组件)是经常使用的组件,相当于HTML的div标签
class MyApp extends StatelessWidget{
@override
Widget build(BuildContext context ){
return MaterialApp(
title:'Text widget',
home:Scaffold(
body:Center(
child:Container(
child:new Text('hello Flutter, i like'),
),
),
),
);
}
}
Alignment属性
这个属性是争对Container内child的对齐方式,也就是容器子内容的对齐方式
- bottomCenter ————– 下部居中对齐
- bottomLeft —————- 下部左对齐
- bottomRight ————— 下部右对齐
- center ——————– 纵横双向居中对齐
- centerLeft —————- 纵向居中横向居左对齐。
- centerRight ————— 纵向居中横向居右对齐。
- topLeft ——————- 顶部左侧对齐。
- topCenter —————– 顶部居中对齐。
- topRight —————— 顶部居左对齐。
home:Scaffold(
body:Center(
child:Container(
child:new Text('hello Flutter, i like'),
alignment: Alignment.center,
),
),
),
设置宽、高和颜色属性
设置宽高相对容易,只要在属性名称后面加入浮点数字就可以
home:Scaffold(
body:Center(
child:Container(
child:new Text('hello Flutter, i like'),
alignment: Alignment.center,
width:500.0,
height:400.0,
color: Colors.lightBlue,
),
),
),
padding属性
padding指的的是Container和child内容器的距离
home:Scaffold(
body:Center(
child:Container(
child:new Text('hello Flutter, i like'),
alignment: Alignment.center,
width:500.0,
height:400.0,
color: Colors.lightBlue,
padding: const EdgeInsets.all(10.0), // 代表上下左右的padding距离都是10
),
),
),
上面主要说明了padding的一个统一的值,如果我们想分别设置呢
padding: const EdgeInsets.fromLTRB(10.0, 50.0, 0.0, 0.0)
这样我们就可以分别设置各个方向的padding值
margin属性
用法同上
margin: const EdgeInsets.all(10.0), // 代表上下左右的margin距离都是10
||或
margin: const EdgeInsets.fromLTRB(10.0, 50.0, 0.0, 0.0)
decoration属性
decoration是container的修饰器,主要功能设置背景和边框
如果你想要给一个背景加一个渐变,这时候需要这个BoxDecoation
home:Scaffold(
body:Center(
child:Container(
child:new Text('hello Flutter, i like'),
alignment: Alignment.center,
width:500.0,
height:400.0,
// color: Colors.lightBlue,
padding: const EdgeInsets.all(10.0), // 代表上下左右的padding距离都是10
decoration: new BoxDecoration(
gradient: const LinearGradient(
colors: [Colors.blue, Colors.red, Colors.white] // 设置渐变色
),
border: Border.all(width: 2.0, color: Colors.red) // 设置边框线的样式
),
),
),
),
注意color和decoration不能共存,会有冲突
🔥Image图片的使用
- Image.asset: 加载资源图片,就是加载项目资源的目录中的图片,加入图片会增加打包的体积,以相对路径引入
- Image.network: 网络资源图片,意思就是引入网络图片路径
- Image.file: 加载本地图片,就是加载本地文件中的图片,不会增加打包体积,以绝对路径引入
- Image.memory: 加载Uint8List资源图片
home:Scaffold(
body:Center(
child:Container(
child: Image.network(
'http://my.ignorantscholar.cn/images/headers.png',
width: 300.0,
height: 300.0,
),
alignment: Alignment.center,
width:500.0,
height:400.0,
// color: Colors.lightBlue,
padding: const EdgeInsets.all(10.0), // 代表上下左右的padding距离都是10
decoration: new BoxDecoration(
gradient: const LinearGradient(
colors: [Colors.blue, Colors.red, Colors.white] // 设置渐变色
),
border: Border.all(width: 2.0, color: Colors.red) // 设置边框线的样式
),
),
),
),
fit属性
fit属性可以控制图片的拉伸和挤压,这些都是根据图片的父级容器来的
- BoxFit.fill: 全图显示,图片会被拉伸,并且充满父容器
- BoxFit.contain: 全图显示,显示原比例,可能会有空隙
- BoxFit.cover: 显示可能拉伸,可能裁剪,充满(图片要充满整个容器,还不变形)
- BoxFit.fitWidth: 宽度充满,(横向充满)
- BoxFit.fitHeight: 高度充满 (属相充满)
- BoxFit.scaleDown: 效果和contain差不多,但是此属性不能超过图片大小,可小不可大
child: Image.network(
'http://my.ignorantscholar.cn/images/headers.png',
width: 300.0,
height: 300.0,
fit: BoxFit.cover, // 不变形,充满整个容器
),
图片混合模式
图片混合模式(colorBlendMode) 和 color 属性一起使用,可以让图片改变颜色
!!!!!!colorBlendMode和color需要同时使用,单独使用一个达不到预期效果
child: Image.network(
'http://my.ignorantscholar.cn/images/headers.png',
width: 300.0,
height: 300.0,
color: Colors.yellow,
colorBlendMode: BlendMode.modulate,
fit: BoxFit.cover,
),
使用项目资源图片
pubspec.yaml文件
如果想配置项目资源文件,就需要使用pubspec.yaml文件,需要把资源文件在这里声明
比如在项目根目录下建立了一个文件images用来存放图片,文件夹下面有一个图片,pic.png,那我们在pubspec.yaml文件中进行声明
assets:
- images/pic.png
child: Image.asset('images/pic.png'),
💧ListView列表组件
ListView的声明
import 'package:flutter/material.dart';
void main () => runApp(MyApp());
class MyApp extends StatelessWidget{
@override
Widget build(BuildContext context ){
return MaterialApp(
title:'Text widget',
home:Scaffold(
body:ListView(
child: <Widget>[
ListTile(
leading: Icon(Icons.assess_time),
title: new Text('assess_time')
),
ListTile(
leading: Icon(Icons.assess_time),
title: new Text('assess_time')
)
]
),
),
);
}
}
我们使用了ListView,然后在他的内部children中,使用了widget数组,因为是一个列表,所以他接受一个数组,然后使用了ListTile组件【列表瓦片】,具体效果可以在项目中查看
图片列表的使用
我们使用网络的方式,插入两张图片
body: new ListView(
children:<Widget>[
new Image.network('http://jspang.com/static/upload/20181111/G-wj-ZQuocWlYOHM6MT2Hbh5.jpg'),
new Image.network('http://jspang.com/static/upload/20181109/1bHNoNGpZjyriCNcvqdKo3s6.jpg'),
]
),
横向列表的使用
使用横向列表需要加一个属性scrollDirection
- Axis.horizontal: 横向滚动
- Axis.vertical: 纵向滚动 【默认纵向滚动】
home:Scaffold(
body:Center(
child:Container(
height:200.0,
child:new ListView(
scrollDirection: Axis.horizontal,
children: <Widget>[
new Container(
width:180.0,
color: Colors.lightBlue,
),
new Container(
width:180.0,
color: Colors.amber,
),
new Container(
width:180.0,
color: Colors.deepOrange,
),
new Container(
width:180.0,
color: Colors.deepPurpleAccent,
),
],
)
),
),
从上面代码我们可以看出,代码嵌套比较深,进行优化,提取
class MyList extends StatelessWidget{
@override
Widget build(BuildContext context) {
return ListView(
scrollDirection: Axis.horizontal,
children: <Widget>[
Container(
width: 180.0,
color: Colors.red,
),
Container(
width: 180.0,
color: Colors.yellow,
),
Container(
width: 180.0,
color: Colors.red,
),
Container(
width: 180.0,
color: Colors.yellow,
)
]
);
}
}
home:Scaffold(
body:Center(
child:Container(
height:200.0,
child: MyList()
),
),
这样看就简洁许多
动态列表的使用
上面的列表是写死的,我们在实际开发中,大多数是不会死的
class MyList extends StatelessWidget{
final List<String> items = new List<String>.generate(1000, (i)=> "Item $i"); // 使用list中的属性generate方法产生List里面的元素
@override
Widget build(BuildContext context) {
return ListView.builder( // 调用动态列表生成
itemCount:items.length,
itemBuilder:(context,index){
return new ListTile(
title:new Text('${items[index]}'),
);
}
);
}
}
🌊GridView网格列表布局组件
import 'package:flutter/material.dart';
void main () => runApp(MyApp());
class MyApp extends StatelessWidget{
@override
Widget build(BuildContext context ){
return MaterialApp(
title:'ListView widget',
home:Scaffold(
body:GridView.count(
padding:const EdgeInsets.all(20.0),
crossAxisSpacing: 10.0,
crossAxisCount: 3,
children: <Widget>[
Container(
color: Colors.red,
),
Container(
color: Colors.red,
),
Container(
color: Colors.red,
),
Container(
color: Colors.red,
),
Container(
color: Colors.red,
)
],
)
),
);
}
}
- crossAxisSpacing: 网格之间 的空隙
- crossAxisSpacing:网格列数,相当于一行放置的网格数量
现在做一个图片的网格布局
body: GridView.count(
padding: const EdgeInsets.all(10.0),
crossAxisSpacing: 2.0,
crossAxisCount: 3,
mainAxisSpacing: 2,
childAspectRatio: 0.7,
children: <Widget>[
new Image.network('http://img5.mtime.cn/mt/2018/10/22/104316.77318635_180X260X4.jpg',fit: BoxFit.cover),
new Image.network('http://img5.mtime.cn/mt/2018/10/10/112514.30587089_180X260X4.jpg',fit: BoxFit.cover),
new Image.network('http://img5.mtime.cn/mt/2018/11/13/093605.61422332_180X260X4.jpg',fit: BoxFit.cover),
new Image.network('http://img5.mtime.cn/mt/2018/11/07/092515.55805319_180X260X4.jpg',fit: BoxFit.cover),
new Image.network('http://img5.mtime.cn/mt/2018/11/21/090246.16772408_135X190X4.jpg',fit: BoxFit.cover),
new Image.network('http://img5.mtime.cn/mt/2018/11/17/162028.94879602_135X190X4.jpg',fit: BoxFit.cover),
new Image.network('http://img5.mtime.cn/mt/2018/11/19/165350.52237320_135X190X4.jpg',fit: BoxFit.cover),
new Image.network('http://img5.mtime.cn/mt/2018/11/16/115256.24365160_180X260X4.jpg',fit: BoxFit.cover),
new Image.network('http://img5.mtime.cn/mt/2018/11/20/141608.71613590_135X190X4.jpg',fit: BoxFit.cover),
],
),
- childAspectRatio: 宽高比, 这个值的意思是宽是高的多少倍