Flutter 常用Widget-图片Image
标签: flutter学习系列 flutter
Flutter中,加载并显示图片使用的是Image组件。我们先来看下这个构造函数:

Image的构造参数有一下几种分别是:
- Image:从Provider获取图像
- Image.asset:加载资源图片
- Image.file:加载本地图片文件
- Image.network:记载网络图片
- Image.memory:加载Uint8List资源图片
我们接下来看一下如何使用
class ImagePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Image.network('https://flutter.cn/assets/flutter-lockup-1caf6476beed76adec3c477586da54de6b552b2f42108ec5bc68dc63bae2df75.png'),
),
);
}
}

我们加载了一张网络图片。其他的使用也比较类似,这里不在赘述。我们看看provider如何使用。
class ImagePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Image(
image: NetworkImage('https://flutter.cn/assets/flutter-lockup-1caf6476beed76adec3c477586da54de6b552b2f42108ec5bc68dc63bae2df75.png'),
),
),
);
}
}

可以看到效果是一样的。ImageProvider是一个抽象类,Flutter为我们提供了一套实现,当然我们也可以自己去实现provider。

这一部分就是Flutter为我们提供的ImageProvider。实际上,开篇介绍的Image的不同构造函数中,就是使用了不同的Provider来实现的。我们在来看看其他的参数。
| 属性 | 类型 | 说明 |
|---|---|---|
| image | ImageProvider | ImageProvider是一个抽象类,Flutter为我们提供了一套实现,当然我们也可以自己去实现provider。 |
| width/height | double | 显示区域的宽高设置,值得注意的是,不要和Image本身的大小混淆,Image Widget只是个容器,容器就有自己的大小,而显示的效果经常要和填充模式配合使用。 |
| fit | BoxFit | 填充模式(下面有详细介绍)。 |
| color | Color | 容器颜色 |
| colorBlendMode | BlendMode | 图片混合模式,注意这个参数要混合Color使用才有作用。https://api.flutter.dev/flutter/dart-ui/BlendMode-class.html |
| alignment | Alignment | 控制图片的在容器中的位置。 |
| repeat |
ImageRepeat |
设置容器比图片大时,图片的重复模式。 |
| centerSlice | Rect | 如果图片被拉伸,那么是重哪个点开始拉伸。 |
| gaplessPlayback | bool | 当provider改变的时候,重新加载的过程中,原图片是否保留。 |
fit:填充模式

BoxFit.fill 不按比例拉伸显示到全部容器。
BoxFit.contain 在保证原图像比例的情况下,尽可能的拉伸充满容器。
BoxFit.cover 保证原图像的比例缩放并充满容器,超出部分剪裁。
我们使用一个200x200的图像,Image容器的大小我们也设置200x200,我们可以看到显示是正常的。
@override Widget build(BuildContext context) { return Scaffold( body: Center( child: Image( image: NetworkImage(_path), width: 200, height: 200, fit: BoxFit.cover, ), ), ); }
我们现在改变宽度,为400.
@override Widget build(BuildContext context) { return Scaffold( body: Center( child: Image( image: NetworkImage(_path), width: 400, height: 200, fit: BoxFit.cover, ), ), ); }
可以看到图片被放大了,超出的部分被剪切掉。
BoxFit.fitWidth 同比缩放,缩放宽度直到宽度充满容器。
我们把这几个参数改一下
width: 200,
height: 500,
fit: BoxFit.fitWidth,width: 300,
height: 500,
fit: BoxFit.fitWidth,width: 300,
height: 200,
fit: BoxFit.fitWidth,应该显示原比例200x200大小
应该显示300x300大小
图片缩放300x300,但是会剪切掉一部分
BoxFit.fitHeight 同比缩放,缩放宽度直到高度充满容器(效果类似fitWidth)。
BoxFit.none 不进行任何缩放,显示原比例,容器容纳不下则剪切。
BoxFit.scaleDown 如果容器显示不下,则采用contain模式;如果容器可以容纳下则采用none。
=========================================================================
color/colorBlendMode 使用红色和图片进行混合
@override Widget build(BuildContext context) { return Scaffold( body: Center( child: Image( color: Colors.red, colorBlendMode: BlendMode.difference, image: NetworkImage(_path), width: 400, height: 200, fit: BoxFit.contain, ), ), ); }
===============================================================
repeat 设置x重复
@override Widget build(BuildContext context) { return Scaffold( body: Center( child: Image( colorBlendMode: BlendMode.difference, image: NetworkImage(_path), width: 400, height: 200, fit: BoxFit.contain, repeat: ImageRepeat.repeatX, ), ), ); }
总结:Flutter中可以使用Image Widget来显示图片,有多种图片的获取方式,也可以自己实现Provider来实现。接下来的文章会继续将常用Widget逐一介绍,在最后的系列中,会公开一个商业级的项目,感兴趣的小伙伴关注。如果您在阅读过程中发现错误,请及时留言给我,我会第一时间改正。也欢迎大家一切交流,共同进步,感谢支持!
智能推荐
Flutter组件学习(4)图片Image
介绍 关于Flutter图片的加载有多种形式 方法 释义 Image() 从ImageProvider中获取图片,从本质上看,下面的几个方法都是他的具体实现。 Image.asset(String name) 从AssetBundler中获取图片 Image.network(String src) 显示网络图片 Image.file(File file) 从File中获取图片 Ima...
flutter 使用image_picker上传图片
第一步:封装,可以单独放在一个文件里 可以直接复制 第二步:打开底部弹框 调用showModalBottomSheet打开底部弹框,return第一步的HspPickerImagePanel(),val值就是返回的本地图片的地址,然后可以处理使用dio上传, 具体可以参考这篇文章https://blog.csdn.net/codekxx/article/details/101770516 注意 上...
flutter image-picker 上传图片
画part页面 底部面板里选择上传相册图片or拍照上传: 相册上传、拍照上传事件 查询今日是否打卡 调接口获取图片上传路径的方法 传参调接口打卡方法...
Flutter图片上传(Dio + Image_picker)
PS: 图片上传功能在项目中属于很常见的功能,网上也有蛮多图片上传的框架,看的眼花缭乱的。。。最后,本着自己最熟悉的才是最好的原则选择 Flutter Dio,所以项目中用的网络框架也是Flutter Dio ,直接拿来写个简单的demo,也算记录下Flutter踩坑心酸史吧。。。 国际惯例(为了省事没做图片大小限制了。。。) test.gif 废话不多说了,直接上代码, 先添加两个依赖: &nb...
Flutter系列之Widget
一、Flutter的核心原则 Flutter包括一个现代的响应式框架、一个2D渲染引擎、现成的widget和开发工具 一切皆为widget 那么,什么是widget呢? Widget是Flutter功能的抽象描述,是视图的配置信息,同样也是数据的映射,是Flutter开发框架中最基本的概念。与其他将视图(View)、控制器(Controller)、活动(Activity)、应用(Applicati...
猜你喜欢
冒泡排序,及改进方式,性能优化400%>>>附图解加源码
首先源码附上,源码中带有注释,看不懂没关系,源码后面附带图解,最后附上代码效率提升图 源码如下: 方案一:其实实现很简单,两层循环,每次内层迭代出最大的一个值,将其放入数组最后一个位置,外层循环的末端便往前移一位。其原理如下图 方案一代码块: 方案二:优化改进 仔细观察上面的图,我们不难发现当迭代到图下这样的情况时,其实已经全排序好了,但是我们还是需要对它进行1,2,3,4,5,6的迭代,这些情况...
css3常用选择器
先介绍一下基本选择器,如下几种 *:通配符。选择页面的所有元素 E:元素选择器。对页面的一些元素进行选择,如p,div,li等 .class:类选择器 #id:id选择器。一个Id在一个页面中只能选择,这是和类选择器的区别 E F:后代选择器。如ul li。选中ul下的li E>F:子元素选择器。如下,可以用 h1 > strong {color:red;}使h1的子元素strong变...
python is not set from command line or npm configuration
问题 猜测原因 python版本冲突 解决方案 去官网找到最新版本python 点击下载,注意记住你下载的目录,下载好以后,打开这个目录下的文件夹,Python310, 整个文件夹复制一下 在项目里运行npm config list --json 找到python的路径 我的是 C:\\Python27\\python.exe 说明项目里用的还是py...
Java8 Stream流操作
前言 我们常常需要将一个容器转化成另一个容器,或是对这个容器中的数据进行批量处理,这时使用Stream流可以大大减少我们的工作量。 1 Stream概述 Java 8 是一个非常成功的版本,这个版本新增的Stream,配合同版本出现的 Lambda ,给我们操作集合(Collection)提供了极大的便利。 那么什么是Stream? Stream将要处理的元素集合看作一种流,在流的过程中,借助St...
带你玩转Visual Studio——带你跳出坑爹的Runtime Library坑
在Windows下进行C++的开发,不可避免的要与Windows的底层库进行交互,然而VS下的一项设置MT、MTd、MD和MDd却经常让人搞迷糊,相信不少人都被他坑过,特别是你工程使用了很多第三库的时候,及容易出现各种链接问题。看一下下面这个错误提示: LIBCMT.lib(_file.obj) : error LNK2005: ___initstdio already defined...







