Flutter04-核心基础-资源管理
Flutter04-核心基础-资源管理
资源管理
Flutter APP 安装包中会包含代码和 assets(资源)两部分。Assets 是会打包到程序安装包中的,可在运行时访问。常见类型的 assets 包括静态数据(例如JSON文件)、配置文件、图标和图片等。
指定 assets
和包管理一样,Flutter 也使用pubspec.yaml 文件来管理应用程序所需的资源
flutter:
assets:
- assets/my_icon.png
- assets/background.png
Asset 变体(variant)
例如,如果应用程序目录中有以下文件:
- …/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中。前者被认为是_main asset_ (主资源),后者被认为是一种变体(variant)。
在选择匹配当前设备分辨率的图片时,Flutter会使用到 asset 变体(见下文)。
加载 assets
您的应用可以通过AssetBundle (opens new window)对象访问其 asset 。有两种主要方法允许从 Asset bundle 中加载字符串或图片(二进制)文件。
加载文本assets
通过 rootBundle (opens new window) 对象加载:每个 Flutter 应用程序都有一个 rootBundle (opens new window) 对象, 通过它可以轻松访问主资源包,直接使用 package:flutter/services.dart 中全局静态的 rootBundle 对象来加载 asset 即可。
加载图片
1)要加载图片,可以使用 AssetImage
import 'package:flutter/services.dart' show rootBundle;
void main(List<String> args) {
// 加载文本assets
WidgetsFlutterBinding.ensureInitialized(); // 解决加载json错误
Future<String> future = rootBundle.loadString('assets/json/config.json');
future.then((value) => print(value));
// 加载图片
runApp(const MaterialApp(
title: 'My app',
home: DecoratedBox(
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage('assets/images/like-icon.png'),
),
)),
));
}
2)直接得到一个显示图片的widget,那么你可以使用Image.asset()方法:
void main(List<String> args) {
runApp(Image.asset('assets/images/like-icon.png'));
}
3)声明分辨率相关的图片 assets
AssetImage 可以将asset的请求逻辑映射到最接近当前设备像素比例(dpi)的asset。为了使这种映射起作用,必须根据特定的目录结构来保存asset:
- …/image.png
- …/Mx/image.png
- …/Nx/image.png
- …etc.
其中 M 和 N 是数字标识符,对应于其中包含的图像的分辨率,也就是说,它们指定不同设备像素比例的图片。
看一个例子:
- …/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将被选择。
如果未在Image widget上指定渲染图像的宽度和高度,那么Image widget将占用与主资源相同的屏幕空间大小。 也就是说,如果.../my_icon.png是72px乘72px,那么.../3.0x/my_icon.png应该是216px乘216px; 但如果未指定宽度和高度,它们都将渲染为72像素×72像素(以逻辑像素为单位)。
pubspec.yaml中asset部分中的每一项都应与实际文件相对应,但主资源项除外。当主资源缺少某个资源时,会按分辨率从低到高的顺序去选择 ,也就是说1x中没有的话会在2x中找,2x中还没有的话就在3x中找。
什么是逻辑分辨率、物理分辨率与像素比?https://www.jianshu.com/p/8563b3b86eef