热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

flutter中的资源和图片加载示例详解-目录封面图指定相应的资源资源绑定Assetbundling资源变体加载资源加载文本资源加载图片加载依赖包中的图片最后封面图下个季度的目标是

封面图

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

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对象有两个主要的方法:

  • loadString()可以让我们加载字符串相关的资源
  • load()可以让我们加载图像以及二进制相关的资源

加载文本资源

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

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

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

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

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

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

import 'package:flutter/services.dart' show rootBundle;
Future 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');

最后

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

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

  • 资源的打包
  • 不同平台的资源
  • 等等

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


推荐阅读
  • 解决发布版APK构建失败的问题 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 原文网址:https:www.cnblogs.comysoceanp7476379.html目录1、AOP什么?2、需求3、解决办法1:使用静态代理4 ... [详细]
  • 本文深入探讨了Spring Cloud Eureka在企业级应用中的高级使用场景及优化策略。首先,介绍了Eureka的安全配置,确保服务注册与发现过程的安全性。接着,分析了Eureka的健康检查机制,提高系统的稳定性和可靠性。随后,详细讨论了Eureka的各项参数调优技巧,以提升性能和响应速度。最后,阐述了如何实现Eureka的高可用性部署,保障服务的连续性和可用性。通过这些内容,开发者可以更好地理解和运用Eureka,提升微服务架构的整体效能。 ... [详细]
  • Android目录遍历工具 | AppCrawler自动化测试进阶(第二部分):个性化配置详解
    终于迎来了“足不出户也能为社会贡献力量”的时刻,但有追求的测试工程师绝不会让自己的生活变得乏味。与其在家消磨时光,不如利用这段时间深入研究和提升自己的技术能力,特别是对AppCrawler自动化测试工具的个性化配置进行详细探索。这不仅能够提高测试效率,还能为项目带来更多的价值。 ... [详细]
  • 效果预览1基本使用代码voidmain(){启动根目录runApp(MaterialApp(home:TestTipsPage(),));}classTestTipsPageext ... [详细]
  • Flutter基础Widgets之AppBar详解
    概述AppBarMaterial风格应用栏,有工具栏和其他的Widget构成应用栏通常用于Scaffold.appBar属性,该属性将应用栏放置在屏幕顶部的固定高度小部件中。对于可 ... [详细]
  • com.sun.javadoc.PackageDoc.exceptions()方法的使用及代码示例 ... [详细]
  • 本文详细介绍了如何使用Python中的smtplib库来发送带有附件的邮件,并提供了完整的代码示例。作者:多测师_王sir,时间:2020年5月20日 17:24,微信:15367499889,公司:上海多测师信息有限公司。 ... [详细]
  • .NET Core 托管服务优化与实践
    在.NET Core应用中,托管服务的形式主要分为进程内托管(InProcess)和进程外托管(OutOfProcess)。这两种托管方式各有优缺点,本文将深入探讨它们的特点,并结合实际案例,介绍如何根据具体需求选择合适的托管模式,以实现性能优化和资源利用的最大化。此外,文章还将分享一些实用的配置技巧和最佳实践,帮助开发者提升应用的稳定性和可维护性。 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • Envoy 流量分配策略优化
    在本研究中,我们对Envoy的流量分配策略进行了优化,旨在提高系统的稳定性和性能。实验环境包括一个前端代理服务(Envoy,IP地址为172.31.57.10)和五个后端服务。通过调整Envoy的配置,实现了更高效的流量分发和负载均衡,显著提升了整体系统的响应速度和可靠性。 ... [详细]
  • 本文深入探讨了ASP.NET Web API与RESTful架构的设计与实现。ASP.NET Web API 是一个强大的框架,能够简化HTTP服务的开发,使其能够广泛支持各种客户端设备。通过详细分析其核心原理和最佳实践,本文为开发者提供了构建高效、可扩展且易于维护的Web服务的指导。此外,还讨论了如何利用RESTful原则优化API设计,确保系统的灵活性和互操作性。 ... [详细]
  • 往期文章Prom ... [详细]
  • Causedby:java.nio.charset.MalformedInputException:Inputlength=1
    java.lang.IllegalStateException:Failedtoloadpropertysourcefromlocationclasspath:applicatio ... [详细]
author-avatar
灬处男求包养灬
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有