Skip to main content

删除 AssetManifest.json

摘要

#

Flutter 应用包含一个名为 AssetManifest.json 的资产文件。此文件实际上包含一个资产列表。应用程序代码可以使用 AssetBundle API 读取它,以确定运行时有哪些资产可用。

AssetManifest.json 文件是一个未公开的实现细节。框架不再使用它,并且计划在 Flutter 的未来版本中不再生成它。如果您的应用程序代码需要获取可用资产的列表,请改用 AssetManifest API。

迁移指南

#

从 Flutter 应用程序代码读取资产清单

#

之前:

dart
import 'dart:convert';
import 'package:flutter/services.dart';

void readAssetList() async {
  final assetManifestContent = await rootBundle.loadString('AssetManifest.json');
  final decodedAssetManifest =
      json.decode(assetManifestContent) as Map<String, Object?>;
  final assets = decodedAssetManifest.keys.toList().cast<String>();
}

之后:

dart
import 'package:flutter/services.dart';

void readAssetList() async {
  final assetManifest = await AssetManifest.loadFromAssetBundle(rootBundle);
  final 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() {
  // AssetManifest.bin 的路径取决于目标平台。
  final pathToAssetManifest = './build/web/assets/AssetManifest.bin';
  final manifest = File(pathToAssetManifest).readAsBytesSync();
  final decoded = const StandardMessageCodec()
      .decodeMessage(ByteData.sublistView(manifest));
  final assets = decoded.keys.cast<String>().toList();
}

请记住,AssetManifest.bin 是 Flutter 的实现细节。读取此文件不是官方支持的工作流程。该文件的内容或格式可能会在未来的 Flutter 版本中更改,恕不另行通知。

时间线

#

从 3.19 后的第四个稳定版本或 3.19 发布一年后(以较晚者为准)开始,将不再生成 AssetManifest.json

参考

#

相关问题:

  • 构建 Flutter 应用时,flutter 工具会生成一个框架未使用 的 AssetManifest.json 文件 (Issue #143577)