loadAllTemplates static method
从 package assets 中异步加载所有的 JSON 模板
Implementation
static Future<List<KoiTemplateManifest>> loadAllTemplates() async {
final AssetManifest manifest = await AssetManifest.loadFromAssetBundle(
rootBundle,
);
// 找出所有的模板 JSON 文件
// 注意:如果是被其他项目依赖,路径会带有 packages/koi_printer_editor/ 前缀
// 如果是本包自己运行,路径可能是 assets/templates/
final templatePaths = manifest.listAssets().where((path) {
return path.contains('assets/templates/') && path.endsWith('.json');
}).toList();
final List<KoiTemplateManifest> templates = [];
for (final path in templatePaths) {
try {
final jsonStr = await rootBundle.loadString(path);
final manifest = KoiTemplateManifest.fromJsonString(jsonStr);
templates.add(manifest);
} catch (e) {
debugPrint('Error loading template $path: $e');
}
}
// 排序: Ticket 文档优先于 Label,同类型内按 category → name 排列。
// 这确保 defaultManifest (列表第一个) 始终是小票模板而非标签模板。
templates.sort((a, b) {
final aIsTicket = a.document is KoiTicketDocument;
final bIsTicket = b.document is KoiTicketDocument;
if (aIsTicket != bIsTicket) return aIsTicket ? -1 : 1;
final catCmp = a.category.compareTo(b.category);
if (catCmp != 0) return catCmp;
return a.name.compareTo(b.name);
});
debugPrint('KoiTemplateLoader: loaded ${templates.length} templates');
return templates;
}