loadAllTemplates static method

Future<List<KoiTemplateManifest>> loadAllTemplates()

从 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;
}