Flutter 中的“Image”和“ImageProvider”有啥区别?

Posted

技术标签:

【中文标题】Flutter 中的“Image”和“ImageProvider”有啥区别?【英文标题】:What is the difference between an "Image" and "ImageProvider" in Flutter?Flutter 中的“Image”和“ImageProvider”有什么区别? 【发布时间】:2020-03-23 09:00:43 【问题描述】:

有与此主题相关的答案,但它们提供的是解决方法而不是解释。

为什么不能在需要 ImageProvider 的地方使用 Image?从概念上讲,它们对我来说听起来是一样的。

child: new CircleAvatar(
  backgroundImage: NetworkImage("https..."),        // works
  backgroundImage: Image.asset('images/image.png'), // error
),

尝试直接使用图片产生的错误是:

错误:无法将参数类型“Image”分配给参数类型“ImageProvider”。

【问题讨论】:

请避免使用effective dart guidelines的新关键字 为什么要投反对票?这是一个合理的问题。 【参考方案1】:

图像是显示图像的小部件。

ImageProvider 允许您在不知道最终资产的确切位置的情况下识别图像。稍后当有人要读取图像时,将解析资产的位置。

【讨论】:

【参考方案2】:

图像与图像提供者

图像提供程序是将图像提供给 Image 小部件。 ;D

图像提供者不一定有图像,但它知道如何获取它。

获取图像

如果您需要 Image 小部件,请使用以下其中一种:

Image.asset() Image.network() Image.file() Image.memory()

获取 ImageProvider

如果您需要ImageProvider,请使用以下之一:

AssetImage() NetworkImage() FileImage() MemoryImage()

将 ImageProvider 转换为图像

如果您有一个ImageProvider 对象并且想要一个Image 小部件,请执行以下操作:

Image(
  image: myImageProvider,
)

将图像转换为 ImageProvider

如果您有一个Image 小部件并且需要它的ImageProvider,请执行以下操作:

myImageWidget.image

【讨论】:

【参考方案3】:

实际上每个背景和前景装饰都只会接受像 AssetImage(),NetworkImage(),FileImage(),MemoryImage() 这样的 ImageProvider...

当你尝试构建一个小部件时,它会使用 Image.asset()、Image.network()、Image.file()、Image.memory()...

【讨论】:

以上是关于Flutter 中的“Image”和“ImageProvider”有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter基础组件06Image

Flutter基础组件06Image

Flutter小部件之图片(Image)和图标(Icon)

Flutter从相册选择图片和相机拍照(image_picker)

如何从 Flutter 中的 url 裁剪和下载图像?

检查图像是不是已加载到 Flutter 中的 Image.network 小部件中