移除 AssetManifest.json
摘要
#Flutter 应用目前包含一个名为 AssetManifest.json
的资产文件。此文件有效地包含资产列表。应用程序代码可以使用 AssetBundle
API 在运行时确定哪些资产可用。
AssetManifest.json
文件是一个未公开的实现细节。框架不再使用它,因此在 Flutter 的未来版本中将不再生成它。如果您的应用程序代码需要获取可用资源的列表,请改用 AssetManifest
API。
迁移指南
#从 Flutter 应用程序代码读取资产清单
#之前
dart
import 'dart:convert';
import 'package:flutter/services.dart';
final String assetManifestContent = await rootBundle.loadString('AssetManifest.json');
final Map<Object?, Object?> decodedAssetManifest =
json.decode(assetManifestContent) as Map<String, Object?>;
final List<String> assets = decodedAssetManifest.keys.toList().cast<String>();
之后
dart
import 'package:flutter/services.dart';
final AssetManifest assetManifest = await AssetManifest.loadFromAssetBundle(rootBundle);
final List<String> assets = assetManifest.listAssets();
从 Flutter 应用外部的 Dart 代码读取资产清单信息
#flutter
CLI 工具会生成一个新的文件 AssetManifest.bin
。它取代了 AssetManifest.json
。此文件包含与 AssetManifest.json
相同的信息,但格式不同。如果您需要从非 Flutter 应用代码中读取此文件,因此无法使用 AssetManifest
API,您仍然可以自行解析该文件。
standard_message_codec 包可用于解析内容。
dart
import 'dart:io';
import 'dart:typed_data';
import 'package:standard_message_codec/standard_message_codec.dart';
void main() {
// The path to AssetManifest.bin depends on the target platform.
final String pathToAssetManifest = './build/web/assets/AssetManifest.bin';
final Uint8List manifest = File(pathToAssetManifest).readAsBytesSync();
final Map<Object?, Object?> decoded = const StandardMessageCodec()
.decodeMessage(ByteData.sublistView(manifest));
final List<String> assets = decoded.keys.cast<String>().toList();
}
请记住,AssetManifest.bin
是 Flutter 的实现细节。读取此文件不是官方支持的工作流程。文件的内容或格式可能会在未来的版本中更改,恕不另行通知。
时间轴
#从 3.19 之后的第四个稳定版本或 3.19 发布一年后(以较晚者为准)开始,AssetManifest.json
将不再生成。
参考
#相关问题
- 在构建 Flutter 应用时,flutter 工具会生成一个框架未使用的 AssetManifest.json 文件 (问题 #143577)
除非另有说明,否则本网站上的文档反映了 Flutter 的最新稳定版本。页面上次更新于 2024-04-06。 查看源代码 或 报告问题.