Flutter学习四:Flutter开发基础(五)资源管理

news2024/9/23 23:25:16

目录

0 引言

1 资源管理

1.1 指定 assets

1.2 Asset 变体(variant)

1.3 加载 assets

1.3.1  加载文本

1.3.2 加载图片

1.3.2.1 声明分辨率相关的图片

1.3.2.2 加载图片

1.3.3 依赖包中的资源图片

 1.3.4 打包包中的 assets

1.3.5  特定平台 assets 

1.3.5.1 设置APP图标

 1.3.5.2 更新启动页

1.4 平台共享 assets


0 引言

本文是对第二版序 | 《Flutter实战·第二版》 (flutterchina.club)的学习和总结。

1 资源管理

Flutter APP 安装包中会包含代码和 assets(资源)两部分。

Assets 是会打包到程序安装包中的,可在运行时访问。

常见类型的 assets 包括静态数据(例如JSON文件)、配置文件、图标和图片等。

1.1 指定 assets

和包管理一样,Flutter 也使用pubspec.yaml 文件来管理应用程序所需的资源。

  • assets指定应用程序的资源文件
  • asset 的路径是相对于pubspec.yaml文件路径的
  • asset 的声明顺序是无关紧要的
  • asset的实际目录可以是任意文件夹
  • 在构建期间,Flutter 将 asset 放置到称为 asset bundle 的特殊存档中,应用程序可以在运行时读取它们(但不能修改)。
flutter:
  assets:
    - assets/my_icon.png
    - assets/background.png

1.2 Asset 变体(variant)

pubspec.yaml的assets 部分中指定 asset 路径时,

flutter:
  assets:
    - graphics/background.png

如果应用程序目录中有以下文件:

  • …/pubspec.yaml
  • …/graphics/my_icon.png
  • …/graphics/background.png
  • …/graphics/dark/background.png
  • ….

那么,在构建过程中,会在相邻子目录中查找具有相同名称的任何文件。

这些文件随后会与指定的 asset 一起被包含在 asset bundle 中,graphics/background.pnggraphics/dark/background.png 这两个文件都将包含在您的 asset bundle中。前者被认为是_main asset_ (主资源),后者被认为是一种变体(variant)。

在选择匹配当前设备分辨率的图片时,Flutter会使用到 asset 变体。

1.3 加载 assets

可以通过AssetBundle 对象访问其 asset 。

1.3.1  加载文本

  • 通过rootBundle对象加载:每个Flutter应用程序都有一个rootBundle对象, 通过它可以轻松访问主资源包,直接使用package:flutter/services.dart中全局静态的rootBundle对象来加载asset即可。
  • 通过 DefaultAssetBundle加载:建议使用 DefaultAssetBundle来获取当前 BuildContext 的AssetBundle。 这种方法不是使用应用程序构建的默认 asset bundle,而是使父级 widget 在运行时动态替换的不同的 AssetBundle,这对于本地化或测试场景很有用。
  • 通常,可以使用DefaultAssetBundle.of()在应用运行时来间接加载 asset(例如JSON文件),而在widget 上下文之外,或其他AssetBundle句柄不可用时,可以使用rootBundle直接加载这些 asset
import 'dart:async' show Future;
import 'package:flutter/services.dart' show rootBundle;

/*
  1.使用rootBundle直接加载 asset(例如JSON文件)
*/
Future<String> loadAsset() async {
  return await rootBundle.loadString('assets/config.json');
}


/*
  2.使用DefaultAssetBundle.of()在应用运行时来间接加载 asset(例如JSON文件)
*/

1.3.2 加载图片

类似于原生开发,Flutter也可以为当前设备加载适合其分辨率的图像。

1.3.2.1 声明分辨率相关的图片

AssetImage可以将asset的请求逻辑映射到最接近当前设备像素比例(dpi)的asset,即使用默认的 asset bundle 加载资源时,内部会自动处理分辨率等,这些处理对开发者来说是无感知的。 (如果使用一些更低级别的类,如 ImageStream或 ImageCache时你会注意到有与缩放相关的参数)。

  • 主资源默认对应1.0倍分辨率的图片
  • 在设备像素比率为1.8的设备上,2.0倍分辨率的图片将被选择

  • 在设备像素比率为2.7的设备上,3.0倍分辨率的图片将被选择

如果未在Image widget上指定渲染图像的宽度和高度,那么Image widget将占用与主资源相同的屏幕空间大小。 也就是说,如果.../background.png是72px乘72px,那么.../3.0x/my_icon.png应该是216px乘216px; 但如果未指定宽度和高度,它们都将渲染为72像素×72像素(以逻辑像素为单位)。

flutter:
  assets:
    - graphics/background.png
    - graphics/2.0x/background.png
    - graphics/3.0x/background.png

1.3.2.2 加载图片

要加载图片,可以使用 AssetImage类。例如,我们可以从上面的asset声明中加载背景图片:

注意,AssetImage 并非是一个widget, 它实际上是一个ImageProvider。

Widget build(BuildContext context) {
  return DecoratedBox(
    decoration: BoxDecoration(
      image: DecorationImage(
        image: AssetImage('graphics/background.png'),
      ),
    ),
  );
}

如果想要直接得到一个显示图片的widget,可以使用Image.asset()方法,如:

Widget build(BuildContext context) {
  return Image.asset('graphics/background.png');
}

1.3.3 依赖包中的资源图片

要加载依赖包中的图像,必须给AssetImage提供package参数。

例如,假设您的应用程序依赖于一个名为“my_icons”的包,它具有如下目录结构:

  • …/pubspec.yaml
  • …/icons/heart.png
  • …/icons/1.5x/heart.png
  • …/icons/2.0x/heart.png

 注意:包在使用本身的资源时也应该加上package参数来获取。

/*
  加载依赖包中的图像
*/

//方法一:
AssetImage('icons/heart.png', package: 'my_icons')

//方法二:
Image.asset('icons/heart.png', package: 'my_icons')

 1.3.4 打包包中的 assets

  • 如果在pubspec.yaml文件中声明了期望的资源,它将会打包到相应的package中。
  • 包本身使用的资源必须在pubspec.yaml中声明。

例如,一个名为“fancy_backgrounds”的包,可能包含以下文件:

  • …/lib/backgrounds/background1.png
  • …/lib/backgrounds/background2.png
  • …/lib/backgrounds/background3.png

注意:lib/是隐含的,在pubspec.yaml中声明时不需要包含在内。 

要想将第一张图像打包到包中,必须在pubspec.yaml的assets部分中声明它: 

flutter:
  assets:
    - packages/fancy_backgrounds/backgrounds/background1.png

1.3.5  特定平台 assets 

上面的资源都是flutter应用中的,这些资源只有在Flutter框架运行之后才能使用。

如果要给我们的应用设置APP图标或者添加启动图,那我们必须使用特定平台的assets。

1.3.5.1 设置APP图标

更新Flutter应用程序启动图标的方式与在本机Android或iOS应用程序中更新启动图标的方式相同。

  • Android

    在 Flutter 项目的根目录中,导航到.../android/app/src/main/res目录,里面包含了各种资源文件夹(如mipmap-hdpi已包含占位符图像 “ic_launcher.png”)。 只需按照Android开发人员指南中的说明, 将其替换为所需的资源,并遵守每种屏幕密度(dpi)的建议图标大小标准。

  • iOS

    在Flutter项目的根目录中,导航到.../ios/Runner/Assets.xcassets/AppIcon.appiconset。该目录中已经包含占位符图片icon-App-xxxxxxxx.png, 只需将它们替换为适当大小的图片,保留原始文件名称。

 1.3.5.2 更新启动页

在 Flutter 框架加载时,Flutter 会使用本地平台机制绘制启动页。

此启动页将持续到Flutter渲染应用程序的第一帧时。

注意: 这意味着如果您不在应用程序的main()方法中调用runApp函数 (或者更具体地说,如果您不调用window.render去响应window.onDrawFrame)的话, 启动屏幕将永远持续显示。

  • Android

要将启动屏幕(splash screen)添加到您的Flutter应用程序, 请导航至.../android/app/src/main。在res/drawable/launch_background.xml,通过自定义drawable来实现自定义启动界面(你也可以直接换一张图片)。

  • iOS

要将图片添加到启动屏幕(splash screen)的中心,请导航至.../ios/Runner。在Assets.xcassets/LaunchImage.imageset, 拖入图片,并命名为LaunchImage.pngLaunchImage@2x.pngLaunchImage@3x.png。 如果你使用不同的文件名,那您还必须更新同一目录中的Contents.json文件,图片的具体尺寸可以查看苹果官方的标准。

1.4 平台共享 assets

如果我们采用的是Flutter+原生的开发模式,那么可能会存Flutter和原生需要共享资源的情况。

比如Flutter项目中已经有了一张图片A,如果原生代码中也要使用A,我们可以将A拷贝一份到原生项目的特定目录。

这样的话虽然功能可以实现,但是最终的应用程序包会变大,因为包含了重复的资源。

为了解决这个问题,Flutter 提供了一种Flutter和原生之间共享资源的方式,实现上需要涉及平台相关的原生代码,可以自行查阅官方文档。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/710726.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

B062-组件 路由 属性扩展 webpack Vue-cli

目录 一&#xff1a;组件1.何为组件2.组件的定义方式全局组件局部组件 3.组件的注意事项4.template的定义方式5.组件获取数据的方式 二&#xff1a;路由1.什么是路由&#xff1f;2.路由的使用步骤 三&#xff1a;Vue属性扩展1.计算属性 computed和监听属性 watch3.钩子函数 mou…

【Redis 三种模式----主从复制、哨兵以及集群】

目录 一、主从复制1.1、主从复制的概念1.2、主从复制的作用1.3、主从复制流程1.4、搭建Redis 主从复制1、环境准备2、安装Redis3、修改 Redis 配置文件&#xff08;Master节点操作&#xff09;4、修改 Redis 配置文件&#xff08;Slave节点操作&#xff09;5、验证主从效果 二、…

[牛客周赛复盘] 牛客周赛 Round 1 20230702

[牛客周赛复盘] 牛客周赛 Round 1 20230702 总结游游画U1. 题目描述2. 思路分析3. 代码实现 游游的数组染色1. 题目描述2. 思路分析3. 代码实现 游游的交换字符1. 题目描述2. 思路分析3. 代码实现 游游的9的倍数1. 题目描述2. 思路分析3. 代码实现 六、参考链接 总结 牛客第一…

时序预测 | MATLAB实现BO-NARX和BO-LSTM贝叶斯优化神经网络股票价格预测比较

时序预测 | MATLAB实现BO-NARX贝叶斯优化非线性自回归外生模型和BO-LSTM贝叶斯优化长短期记忆神经网络股票价格预测比较 目录 时序预测 | MATLAB实现BO-NARX贝叶斯优化非线性自回归外生模型和BO-LSTM贝叶斯优化长短期记忆神经网络股票价格预测比较效果一览基本介绍研究过程程序…

《分布式中间件技术实战:Java版》学习笔记(二):RabbitMQ死信队列/延迟队列实现商品扣库存

一.关于RabbitMQ 1.RabbitMQ交换机类型 (1).FanoutExchange&#xff1a;广播交换机。消息发送到交换机后&#xff0c;会广播到所有队列&#xff0c;不需要经过路由。 (2).DirectExchange&#xff1a;直通交换机。生产者发送消息到交换机(Exchange)&#xff0c;再经过路由(Ro…

自然语言处理从入门到应用——预训练模型总览:预训练模型的拓展

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 相关文章&#xff1a; 预训练模型总览&#xff1a;从宏观视角了解预训练模型 预训练模型总览&#xff1a;词嵌入的两大范式 预训练模型总览&#xff1a;两大任务类型 预训练模型总览&#xff1a;预训练模型的拓展 …

Fully-Convolutional Siamese Networks for Object Tracking(SiamFC)

Fully-Convolutional Siamese Networks for Object Tracking&#xff08;SiamFC&#xff0c;ECCV2016&#xff09; 全卷积网络的优势在于&#xff0c;可以将一个更大的搜索图像作为输入提供给网络&#xff0c;它将在单个评估中计算所有平移后的子窗口的相似度&#xff0c;而不…

安全中级11:sql注入+联合、报错、时间盲注+sqlmap使用

目录 一、sql注入原理 二、联合SQL注入的方法 1.总体的思路 &#xff08;1&#xff09;先进行闭合&#xff0c;进行报错 &#xff08;2&#xff09;进行逃逸 &#xff08;3&#xff09;外带数据 &#xff08;4&#xff09;获取库名 表名 列名 数据 &#xff08;5&#…

【PADS封装】Dsub(DB9,DB15d等)公母头座子封装(带3D)

包含了我们平时常用的贴片Dsub(DB9,DB15等)公母头座子封装&#xff0c;总共28种封装及精美3D模型。完全能满足日常设计使用。每个封装都搭配了精美的3D模型哦。 1.D-Sub是被用来连接数据生成设备和数据输出设备&#xff0c;D-Sub和VGA&#xff0c;两者叫法不同。VGA是IBM在1987…

node-sass 安装失败解决办法

前言 很多小伙伴在安装 node-sass 的时候都失败了&#xff0c;主要的原因是 node 版本和项目依赖的 node-sass 版本不匹配。 解决方案 解决方案&#xff1a;把项目中的 node-sass 替换为 sass&#xff0c;其实 node-sass 已被官方弃用。 官方公告&#xff1a; LibSass and …

Echarts X轴label标签文本和刻度线对齐显示,而不是呈现在两个刻度线之间

如下图所示X轴标签文本Mon位于两个刻度线中间&#xff1a; 想要的效果是如下图&#xff0c;刻度线正下方是标签文本Mon&#xff1a; 只需要在xAxis中添加axisTick的alignWithLabel属性&#xff0c;属性值设为true即可&#xff1a; option {xAxis: {type: category,axisTick: …

Nginx【Nginx虚拟主机单网卡多IP配置、Nginx虚拟主机基于域名的配置 】(四)-全面详解(学习总结---从入门到深化)

Nginx虚拟主机单网卡多IP配置 通过不同的IP区分不同的虚拟主机&#xff0c;此类虚拟主机对应的企业应用非常少见&#xff0c;一般不同业务需要使用多IP的常见都会在负载均衡器上进行VIP绑定&#xff0c;而不是在Web上通过绑定IP区分不同的虚拟机。 需求 一台Linux服务器绑定两…

Hadoop基础——MapReduce

1. Hadoop序列化和反序列化及自定义bean对象实现序列化&#xff1f; 1) 序列化和反序列化的含义序列化是将内存中的对象转换为字节序列&#xff0c;以便持久化和网络传输。 反序列化就是将字节序列或者是持久化数据转换成内存中的对象。 Java的序列化是一个重量级序列化框架&a…

《TCP IP网络编程》第一章

2023.6.28 正式开始学习网络编程。 每一章每一节的笔记都会记录在博客中以便复习。 第1章 1.1理解网络编程和套接字 网络编程又叫套接字编程。所谓网络编程&#xff0c;就是编写程序使两台连网的计算机相互交换数据。 为什么叫套接字编程&#xff1f; 我们平常将插头插入插座上…

基于传统检测算法hog+svm实现目标检测

直接上效果图&#xff1a; 代码仓库和视频演示b站视频004期&#xff1a; 到此一游7758258的个人空间-到此一游7758258个人主页-哔哩哔哩视频 代码展示&#xff1a; 数据集在data文件夹下 需要检测的目标对象数据集放在positive文件夹下 不需要的检测对象放在negative文件夹下…

如何提高个人领导力?

当今竞争激烈的商业环境中&#xff0c;领导力变得越来越重要。领导力不仅是一项人类的艺术和科学&#xff0c;还由对人和组织的理解、管理和激励能力组成。因此&#xff0c;不断提高自身的领导力水平是每个领导者必须面对的挑战。而对于想要提高自身领导力的读者来说&#xff0…

复习之linux中的远程登陆服务

一、实验环境配置 本次实验需要两台新的虚拟机&#xff0c;因此我们reset虚拟机aa 和 bb 修改虚拟机的主机名配置基础ip网络删除/root/.ssh/目录------恢复原始状态 1. 重置虚拟机aa,bb # westos-vmctl reset aa 2. 修改虚拟机的主机名 # hostnamectl set-hostname b…

结构体指针

结构体数组 #include<stdio.h> struct student {char name[20];int age;int scores[3];char addr[50]; }; int main() {struct student stu{"林冲",30,100,100,100,"汴京"};struct student* p;p&stu;//printf("%s\n",(*p).name);//pr…

Table表格(antd-design组件库)简单使用

1.Table表格 展示行列数据。 2.何时使用 当有大量结构化的数据需要展现时&#xff1b; 当需要对数据进行排序、搜索、分页、自定义操作等复杂行为时。 组件代码来自&#xff1a; 表格 Table - Ant Design 3.本地验证前的准备 参考文章【react项目antd组件-demo:hello-world rea…

网络环境TFTPNFS搭建

文章目录 1. TFTP服务搭建2. NFS 环境搭建 1. TFTP服务搭建 1、Ubuntu上搭建TFTP服务器&#xff0c;需要安装tftp-hpa和tftpd-hpa&#xff0c;命令如下&#xff1a; sudo apt-get install tftp-hpa tftpd-hpa sudo apt-get install xinetd2、TFTP也需要一个文件夹来存放文件…