文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

flutter中的资源和图片加载示例详解

2022-12-29 15:00

关注

封面图

下个季度的目标是把前端监控相关的内容梳理出来,梳理出来之后可能会在公司内部做个分享~

Flutter应用程序既括代码也包括一些其他的资产,我们通常这些资产为资源。

有时候我会思考assets这个单词,在程序中到底应该翻译为资产呢?还是翻译为资源?按照习惯,我们这里还是称为资源好了~

这些资源是一些与应用程序捆绑在一起和并且部署应用时会用到的的文件,在运行时也可以进行访问。常见类型的资源包括静态数据(例如,JSON文件)、配置文件、图标和图像(JPEG、WebP、GIF、动画WebP/GIF、PNG、BMP和WBMP)等等。

指定相应的资源

Flutter使用位于项目根目录的pubspec.yaml文件来识别应用程序所需的资源。

yaml文件是一种类似于json的可读性高,用来表示数据序列化的文件格式。

比如:

flutter:
  assets:
    - assets/my_icon.png
    - assets/background.png

如果我们想要包含目录下的所有资产,我们需要指定目录名,并在末尾使用/字符:

flutter:
  assets:
    - directory/
    - directory/subdirectory/

需要⚠注意的是:


资源绑定 Asset bundling

flutter应用中的资源必须包含在应用中,同时,每个资源都需要在pubspec.yaml文件中指定相应的路径。资源之间的顺序无关紧要。

在Flutter应用的构建过程中,Flutter会将资源放入一个特殊的归档文件,称为asset bundle,应用程序在运行时从中读取相应的资源。

资源变体

应用的构建过程支持资源变体的概念:即,不同版本的资源有可能显示在不同的上下文之中。当我们在pubspec.yaml的assets部分中指定资源的路径时,构建过程会在相邻子目录中查找任何同名文件。然后,这些文件与指定的资源一起包含在asset bundle(资源包)中。

例如,假设我们有如下资源:

.../pubspec.yaml
.../graphics/my_icon.png
.../graphics/background.png
.../graphics/dark/background.png
...etc.

我们的pubspec.yaml文件配置如下:

flutter:
  assets:
    - graphics/background.png

这时候/graphics/background.png/graphics/dark/background.png这两个文件都会出现在我们的asset bundle(资源包)之中。

前者被认为是一个主要的资源,后者则被认为是一个变体的资源。

如果我们只指定目录:

flutter:
  assets:
    - graphics/

那么,graphics/my_icon.pnggraphics/background.png 以及 graphics/dark/background.png 都会包含在我们的asset bundle(资源包)之中。

加载资源

Flutter应用可以通过AssetBundle对象访问资源。

AssetBundle对象有两个主要的方法:

加载文本资源

每个Flutter应用程序都有一个rootBundle对象,方便访问主资源包。

我们可以从package:flutter/services.dart中直接导入这个方法,直接使用。

但是通常的建议是:通过使用DefaultAssetBundle组件来获取当前buildContextAssetBundle

这种方法允许父组件在运行时替换不同的AssetBundle,对于本地化或测试场景非常有用。

通常情况下,我们可以使用DefaultAssetBundle.of()方法从应用程序的运行时rootBundle间接加载资产,例如JSON文件。

在组件的上下文之外,或者当AssetBundle的句柄不可用时,我们可以使用rootBundle直接加载此类资源。例如:

import 'package:flutter/services.dart' show rootBundle;
Future<String> loadAsset() async {
  return await rootBundle.loadString('assets/config.json');
}

加载图片

Flutter可以根据当前设备像素比加载分辨率适当的图像。

AssetImage知道如何将逻辑请求的资源映射到与当前设备像素比率最匹配的资源上。为了使此映射正常工作,应根据特定的目录结构排列资产,例如:

.../image.png
.../Mx/image.png
.../Nx/image.png
...etc.

其中M和N是数字标识符,对应于其中包含的图像的标称分辨率。换句话说,它们指定了图像的设备像素比。

主要资源默认对应1.0的分辨率。例如,名为my_icon.png的图像:

.../my_icon.png
.../2.0x/my_icon.png
.../3.0x/my_icon.png

在设备像素比率为1.8的设备上,.../2.0x/my_icon.png这个图像将会被加载。在设备像素比率为2.7的设备上,.../3.0x/my_icon.png这个图像将会被加载。

如果未在“图像”组件件上指定渲染图像的宽度和高度,则使用标称分辨率缩放资源,使其占用与主资源相同的屏幕空间,只是分辨率更高。也就是说,如果/my_icon.png72px乘72px,然后/3.0x/my_icon.png应为216px x 216px;但如果没有指定宽度和高度,它们都会呈现为72px乘72px(以逻辑像素为单位)。

想要真正的加载一张图片,我们只需要在组件的build方法中使用AssetsImage对象,例如:

return const Image(image: AssetImage('graphics/background.png'));

加载依赖包中的图片

想要加载依赖包中的图片,我们需要将包的名称传递给AssetImage对象。

假设我们有一个图片的依赖包名字为my_icons,它内部结构如下:

.../pubspec.yaml
.../icons/heart.png
.../icons/1.5x/heart.png
.../icons/2.0x/heart.png
...etc.

想要加载这些图片,我们需要这样使用:

return const AssetImage('icons/heart.png', package: 'my_icons');

最后

资源和图片的内容这里仅仅描述了一些基本的概念和用法~

当然还包括其他一些内容,比如:

这些都是我们需要注意的内容~

以上就是flutter中的资源和图片加载示例详解的详细内容,更多关于flutter资源图片加载的资料请关注编程网其它相关文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯