Flutter基础组件
Flutter入门笔记系列文章部分内容来源于《Flutter 实战》,如有侵权请联系删除!
一、Image
Flutter中的Image有点类似于Android中的ImageView,它的作用是加载并显示图片,图片的来源可以是asset、文件、内存以及网络。
在Flutter中,加载图片的任务是交给ImageProvider来完成的。ImageProvider 是一个抽象类,主要定义了图片数据获取的接口load(),从不同的数据源获取图片需要实现不同的ImageProvider ,如AssetImage是实现了从Asset中加载图片的ImageProvider,而NetworkImage实现了从网络加载图片的ImageProvider。
接下来看看Image是如何加载图片的。
-
加载asset图片
1. 在工程根目录下创建一个images目录,并将图片start_icon.png拷贝到该目录。

2. 添加asset图片资源,在pubspec.yaml中的flutter部分添加如下内容:
flutter:
……
assets:
- images/star_icon.png
3. 加载图片
Image(image: AssetImage("images/star_icon.png"),
width: 30, height: 30,)
Image还提供了一个快捷的构建方法Image.asset:
Image.asset("images/star_icon.png",
width: 30, height: 30,)
两种方式达到d效果是一样的,效果图如下:

-
加载网络图片
与加载asset类似,加载网络图片也有快捷方法,下面是两种加载方法:
Image(
image: NetworkImage(
"https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=2513068450,997311685&fm=26&gp=0.jpg"),
width: 200,
height: 200,
fit: BoxFit.fitHeight,
),
//快捷方式
Image.network(
"https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=2513068450,997311685&fm=26&gp=0.jpg",
width: 200,
height: 200,
fit: BoxFit.fitHeight,
)
运行效果:

-
Image属性
Image在显示图片时定义了一系列参数,通过这些参数我们可以控制图片的显示外观、大小、混合效果等。我们看一下Image的主要参数:
const Image({
...
this.width, //图片的宽
this.height, //图片高度
this.color, //图片的混合色值
this.colorBlendMode, //混合模式
this.fit,//缩放模式
this.alignment = Alignment.center, //对齐方式
this.repeat = ImageRepeat.noRepeat, //重复方式
...
})
1、width、height:用于设置图片的宽、高,当不指定宽高时,图片会根据当前父容器的限制,尽可能的显示其原始大小,如果只设置width、height的其中一个,那么另一个属性默认会按比例缩放,但可以通过下面介绍的fit属性来指定适应规则。
2、fit:该属性用于在图片的显示空间和图片本身大小不同时指定图片的适应模式,有点类似于Android 中ImageView的scaleType属性。适应模式是在BoxFit中定义,它是一个枚举类型,有如下值:
- fill:会拉伸填充满显示空间,图片本身长宽比会发生变化,图片会变形。
- cover:会按图片的长宽比放大后居中填满显示空间,图片不会变形,超出显示空间部分会被剪裁。
- contain:这是图片的默认适应规则,图片会在保证图片本身长宽比不变的情况下缩放以适应当前显示空间,图片不会变形。
- fitWidth:图片的宽度会缩放到显示空间的宽度,高度会按比例缩放,然后居中显示,图片不会变形,超出显示空间部分会被剪裁。
- fitHeight:图片的高度会缩放到显示空间的高度,宽度会按比例缩放,然后居中显示,图片不会变形,超出显示空间部分会被剪裁。
-
none:图片没有适应策略,会在显示空间内显示图片,如果图片比显示空间大,则显示空间只会显示图片中间部分。
来源于《Flutter 实战》
3、color和 colorBlendMode:在图片绘制时可以对每一个像素进行颜色混合处理,color指定混合色,而colorBlendMode指定混合模式。
Image(
image: NetworkImage(
"https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=2513068450,997311685&fm=26&gp=0.jpg"),
width: 200,
height: 200,
fit: BoxFit.fitHeight,
),
Image.network(
"https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=2513068450,997311685&fm=26&gp=0.jpg",
width: 200,
height: 200,
color: Colors.green,
colorBlendMode: BlendMode.color,
fit: BoxFit.fitHeight,
)

4、repeat:当图片本身大小小于显示空间时,指定图片的重复规则。
Image.asset(
"images/star_icon.png",
width: 100,
height: 100,
),
Image.asset(
"images/star_icon.png",
width: 100,
height: 100,
repeat: ImageRepeat.repeatX,
),
Image.asset(
"images/star_icon.png",
width: 100,
height: 100,
repeat: ImageRepeat.repeatY,
)
重复效果如下:

二、Icon
Flutter中,可以像Web开发一样使用iconfont,iconfont即“字体图标”,它是将图标做成字体文件,然后通过指定不同的字符而显示不同的图片。
在字体文件中,每一个字符都对应一个位码,而每一个位码对应一个显示字形,不同的字体就是指字形不同,即字符对应的字形是不同的。而在iconfont中,只是将位码对应的字形做成了图标,所以不同的字符最终就会渲染成不同的图标。
在Flutter开发中,iconfont和图片相比有如下优势:
- 体积小:可以减小安装包大小。
- 矢量的:iconfont都是矢量图标,放大不会影响其清晰度。
- 可以应用文本样式:可以像文本一样改变字体图标的颜色、大小对齐等。
- 可以通过TextSpan和文本混用。
使用Material Design字体图标
Flutter默认包含了一套Material Design的字体图标,在pubspec.yaml
文件中的配置如下
flutter:
uses-material-design: true
Material Design所有图标可以在其官网查看:https://material.io/tools/icons/
Icon(
Icons.accessible,
size: 60,
color: Colors.green,
),
Icon(
Icons.error,
color: Colors.green,
),
Icon(
Icons.fingerprint,
color: Colors.green,
)
运行效果:

使用自定义字体图标
Flutter也支持使用自定义字体图标。素材库上有很多字体图标素材,我们可以选择自己需要的图标打包下载后,会生成一些不同格式的字体文件,在Flutter中,我们使用ttf格式。
1、准备好ttf素材文件,在根目录创建fonts文件夹,把素材文件放入该目录

2、在pubspec.yaml文件中导入tff文件

fonts:
- family: myIcon #指定一个字体名
fonts:
- asset: fonts/iconfont.ttf
3、为了使用方便,我们模仿Icons类,编写一个自定义的MyIcons类
class MyIcons {
static const IconData xiyiji = const IconData(
0xe71c,
fontFamily: 'iconfont',
);
}
4、使用我们自定义的字体图标
Icon(
MyIcons.xiyiji, //自定义字体图标
color: Colors.purple,
),
运行效果

可以看到成功显示出了自定义的字体图标。