import 'dart:convert'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart' show rootBundle; import 'package:smtias_capture/models/preview_region.dart'; /// `assets/config/preview_region.json` を読み込み, /// プレビュークロップ領域([PreviewRegion])を提供するサービス. /// /// ロード優先順位: /// 1. assets の `preview_region.json` が valid ならそれを使用 /// 2. 読み込み失敗・不正値なら [PreviewRegion.full] にフォールバック class PreviewRegionService { static const _assetPath = 'assets/config/preview_region.json'; /// config を読み込んでプレビュー領域を返す. /// /// 優先順位: assets → [PreviewRegion.full]. /// assets 読み込み失敗・不正値なら [PreviewRegion.full] にフォールバックする. Future load() async { // (1) assets ファイル final assetsRegion = await _loadAssets(); if (assetsRegion != null) { return assetsRegion; } // (2) フォールバック return PreviewRegion.full; } /// assets ファイルから読み込む.読み込み失敗・不正値なら null を返す. Future _loadAssets() async { try { final raw = await rootBundle.loadString(_assetPath); final decoded = json.decode(raw); if (decoded is! Map) { return null; } final regionJson = decoded['preview_region']; if (regionJson is! Map) { return null; } final region = PreviewRegion.fromJson(regionJson); if (!region.isValid) { debugPrint('PreviewRegionService: assets の領域値が不正のためフル表示にフォールバック'); return null; } return region; } catch (e) { debugPrint('PreviewRegionService: assets 読み込み失敗 ($e)'); return null; } } }