ponshu-room-lite/docs/archive/REMAINING_TASKS_DETAILED_EX...

14 KiB
Raw Permalink Blame History

残課題の詳細説明と推奨対応

📅 作成日時

2026年2月4日

🎯 対象バージョン

v1.0.11+22


残課題一覧

🟡 優先度: 中(次期バージョン推奨)


1. Matrix4 deprecated API の移行

📍 場所

🔍 問題の内容

現在のコード:

// Line 121-123: 初期表示時のマップ配置
final matrix = Matrix4.identity()
  ..translate(xOffset, 10.0)  // ❌ deprecated
  ..scale(fitScale);          // ❌ deprecated

// Line 158-160: リセットボタン押下時のマップ配置
final matrix = Matrix4.identity()
  ..translate(xOffset, 10.0)  // ❌ deprecated
  ..scale(fitScale);          // ❌ deprecated

何が問題か:

  • Matrix4.translate()Matrix4.scale() が Flutter 3.38.3 で deprecated非推奨になった
  • 将来のFlutterバージョンでは削除される可能性がある
  • 現在は動作するが、flutter analyze で警告が出る

影響範囲:

  • 酒蔵マップ画面(日本地図)の拡大縮小・移動機能
  • リセットボタン(左下の回転アイコン)

推奨する修正方法

Step 1: vector_math パッケージのインポート確認

pubspec.yaml を確認:

dependencies:
  vector_math: ^2.1.4  # 既に含まれている可能性が高い

もし含まれていなければ:

flutter pub add vector_math

Step 2: brewery_map_screen.dart の冒頭に import 追加

import 'package:vector_math/vector_math_64.dart'; // Vector3 のため

Step 3: 2箇所のコードを修正

修正箇所1: Line 121-123

// Before (DEPRECATED):
final matrix = Matrix4.identity()
  ..translate(xOffset, 10.0)
  ..scale(fitScale);

// After (FIXED):
final matrix = Matrix4.identity()
  ..translateByVector3(Vector3(xOffset, 10.0, 0.0))
  ..scaleByDouble(fitScale);

修正箇所2: Line 158-160

// Before (DEPRECATED):
final matrix = Matrix4.identity()
  ..translate(xOffset, 10.0)
  ..scale(fitScale);

// After (FIXED):
final matrix = Matrix4.identity()
  ..translateByVector3(Vector3(xOffset, 10.0, 0.0))
  ..scaleByDouble(fitScale);

🧪 実機テスト項目(必須)

修正後、以下を必ず実機で確認してください:

  1. マップ画面を開く

    • 日本地図が正しく表示される
    • 初期表示時の位置・サイズが正常
  2. ピンチイン/ピンチアウト(拡大縮小)

    • 2本指でピンチイン縮小が滑らかに動作
    • 2本指でピンチアウト拡大が滑らかに動作
    • 最小サイズ・最大サイズの制限が機能している
  3. ドラッグ移動

    • 1本指でマップをドラッグできる
    • 移動範囲が適切(マップが画面外に消えない)
  4. リセットボタン

    • 左下の回転アイコンをタップ
    • マップが初期位置・サイズに戻る
    • アニメーションが滑らかに表示される
  5. 都道府県タップ

    • 都道府県をタップするとモーダルが表示される
    • タップ判定が正常

⚠️ リスク評価

  • リスクレベル: 🔴
  • 理由: 3D変換行列の操作のため、視覚的なバグが発生しやすい
  • 対策: 実機テスト必須(エミュレータだけでは不十分)

📝 完全な修正コード例

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:lucide_icons/lucide_icons.dart';
import 'package:vector_math/vector_math_64.dart'; // 追加
import 'dart:io'; // File
import '../../providers/sake_list_provider.dart';
import '../../screens/sake_detail_screen.dart'; // Detail Screen
import '../../widgets/map/prefecture_tile_map.dart';
import '../../theme/app_colors.dart';
import '../../models/maps/japan_map_data.dart';
import '../../providers/ui_experiment_provider.dart';
import '../../models/schema/item_type.dart'; // Phase D4: For ItemType.sake filtering

// ... (他のコードは省略) ...

// Line 117-127 を修正:
if (!_isMapInitialized) {
   // Center horizontally
   final xOffset = (availableWidth - (mapWidth * fitScale)) / 2;

   final matrix = Matrix4.identity()
     ..translateByVector3(Vector3(xOffset, 10.0, 0.0))  // ✅ FIXED
     ..scaleByDouble(fitScale);                         // ✅ FIXED

   _transformationController.value = matrix;
   _isMapInitialized = true;
}

// ... (中略) ...

// Line 155-162 を修正:
FloatingActionButton.small(
  heroTag: 'map_reset',
  backgroundColor: appColors.surfaceElevated,
  foregroundColor: appColors.brandPrimary,
  elevation: 2,
  onPressed: () {
     // Reset to initial state (Fit Width)
     final xOffset = (availableWidth - (mapWidth * fitScale)) / 2;
     final matrix = Matrix4.identity()
       ..translateByVector3(Vector3(xOffset, 10.0, 0.0))  // ✅ FIXED
       ..scaleByDouble(fitScale);                         // ✅ FIXED
     _transformationController.value = matrix;
  },
  child: const Icon(LucideIcons.rotateCcw, size: 20),
),

2. ExpansionTileController deprecated の移行

📍 場所

🔍 問題の内容

現在のコード:

// Line 24: コントローラーの宣言
final ExpansionTileController _expansionController = ExpansionTileController(); // ❌ deprecated

// Line 166: ExpansionTile での使用
ExpansionTile(
  controller: _expansionController,  // ❌ deprecated
  // ...
)

// Line 199: 編集モード時の展開
_expansionController.expand();  // ❌ deprecated

何が問題か:

  • ExpansionTileController が Flutter 3.31.0 で deprecated になった
  • 新しいAPIは ExpansibleController
  • 現在は動作するが、flutter analyze で警告が出る

影響範囲:

  • 酒詳細画面の「詳細」セクションAI解析情報
  • 展開/折りたたみ動作
  • 編集ボタン押下時の自動展開

推奨する修正方法

Step 1: コントローラーの型を変更

// Before (Line 24):
final ExpansionTileController _expansionController = ExpansionTileController();

// After:
final ExpansibleController _expansionController = ExpansibleController();

Step 2: 使用箇所は変更不要

ExpansionTilecontroller パラメータと .expand() メソッドは、 ExpansibleController でも同じ名前で使えるため、他の箇所は変更不要です。


🧪 実機テスト項目(必須)

修正後、以下を必ず実機で確認してください:

  1. 酒詳細画面を開く

    • 「詳細」セクションが表示される
    • 初期状態では折りたたまれている
  2. 手動での展開/折りたたみ

    • 「詳細」行をタップして展開
    • もう一度タップして折りたたみ
    • アニメーションが滑らかに表示される
  3. 編集ボタンでの自動展開

    • 右側の編集アイコン(鉛筆マーク)をタップ
    • 「詳細」セクションが自動的に展開される
    • 編集モードに切り替わる(テキストフィールドが表示される)
  4. 編集モードでの動作

    • 特定名称、精米歩合などを編集できる
    • 「保存」ボタンで保存できる
    • 「キャンセル」ボタンで元に戻る
  5. セット商品での非表示

    • セット商品の詳細画面では「詳細」セクションが表示されない

⚠️ リスク評価

  • リスクレベル: 🟡
  • 理由: UIの展開/折りたたみ動作のみ、データ変更なし
  • 対策: 実機テストで動作確認

📝 完全な修正コード

import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:lucide_icons/lucide_icons.dart';
import '../../models/sake_item.dart';
import '../../theme/app_colors.dart';
import 'package:hive_flutter/hive_flutter.dart';

class SakeDetailSpecs extends StatefulWidget {
  final SakeItem sake;
  final ValueChanged<SakeItem> onUpdate;

  const SakeDetailSpecs({
    super.key,
    required this.sake,
    required this.onUpdate,
  });

  @override
  State<SakeDetailSpecs> createState() => _SakeDetailSpecsState();
}

class _SakeDetailSpecsState extends State<SakeDetailSpecs> {
  bool _isEditing = false;
  final ExpansibleController _expansionController = ExpansibleController(); // ✅ FIXED

  // ... (他のコードは変更なし) ...
}

3. rawSakeListItemsProvider にコメント追加

📍 場所

🔍 問題の内容

現在のコード:

// Line 189:
final allItems = ref.read(rawSakeListItemsProvider).asData?.value ?? [];

何が問題か:

  • rawSakeListItemsProvider は Phase D6 で「空状態判定専用」として設計された
  • しかし、Dev Menu開発者メニューでは「全データ解析」に使用されている
  • コメントがないため、なぜ rawSakeListItemsProvider を使っているのか不明確
  • 将来的に誤って allSakeItemsProvider に変更されるリスクがある

影響範囲:

  • Dev Menu の「データ修復(再解析)」機能
  • セット商品・Draft を含む全データの統計情報

推奨する修正方法

判断基準

Option A: コメント追加(推奨)

Dev Menu でセット商品・Draft を含む全データの統計が必要な場合:

// Dev Menu: セット商品・Draft含む全データを解析するため rawSakeListItemsProvider を使用
// Phase D6設計: rawSakeListItemsProvider はフィルタリング前の生データを提供
final allItems = ref.read(rawSakeListItemsProvider).asData?.value ?? [];

Option B: allSakeItemsProvider に変更

ユーザーが見える範囲のデータのみ統計が必要な場合:

// Dev Menu: ユーザーに表示されるデータのみを解析
// セット商品・Draftは除外される
final allItems = ref.read(allSakeItemsProvider).asData?.value ?? [];

🧪 実機テスト項目

修正後、以下を確認してください:

  1. Dev Menu を開く

    • 設定画面 → その他 → 開発者メニュー
  2. データ修復を実行

    • 「データ修復(再解析)」をタップ
    • 修復対象件数が表示される
    • セット商品も対象に含まれるか確認Option A の場合)

⚠️ リスク評価

  • リスクレベル: 🟢
  • 理由: コメント追加のみ、または明確な意図での Provider 変更
  • 対策: Dev Menu の動作確認のみ

📝 推奨する修正コードOption A

Future<void> _runBatchAnalysis(BuildContext context, WidgetRef ref) async {
  // Dev Menu: セット商品・Draft含む全データを解析するため rawSakeListItemsProvider を使用
  // Phase D6設計: rawSakeListItemsProvider はフィルタリング前の生データを提供
  // allSakeItemsProvider を使うと、セット商品・Draftが除外されてしまう
  final allItems = ref.read(rawSakeListItemsProvider).asData?.value ?? [];
  if (allItems.isEmpty) return;

  // Filter items that need repair (e.g., empty stats)
  final targets = allItems.where((item) {
    final stats = item.hiddenSpecs.sakeTasteStats;
    final isStatsEmpty = stats.aroma == 0 && stats.bitterness == 0 && stats.sweetness == 0 &&
                         stats.acidity == 0 && stats.body == 0;
    return isStatsEmpty || item.metadata.aiConfidence == null;
  }).toList();

  // ... (残りのコードは変更なし) ...
}

📊 残課題の優先順位と推奨スケジュール

次期バージョン v1.0.12 での対応推奨

課題 優先度 作業時間 リスク 推奨タイミング
1. Matrix4 deprecated 🟡 1.5時間 🔴 次期バージョン必須
2. ExpansionTileController 🟡 1時間 🟡 次期バージョン必須
3. rawSakeListItemsProvider コメント 🟢 10分 🟢 任意

推奨作業順序

Day 12時間

  1. Matrix4 deprecated 移行30分
  2. 実機テスト: 酒蔵マップ30分
  3. ExpansionTileController 移行20分
  4. 実機テスト: 酒詳細画面20分
  5. rawSakeListItemsProvider コメント追加10分
  6. flutter analyze 確認10分

Day 21時間

  1. 最終ビルドLite版 + Pro版30分
  2. 受け入れテストACCEPTANCE_TEST_CHECKLIST.md30分

ユーザーが決める必要があること

3. rawSakeListItemsProvider の使用目的

質問:

Dev Menu の「データ修復(再解析)」で、セット商品も含めて修復しますか?

Option A: 含める(推奨)

  • セット商品のAI解析情報も修復される
  • rawSakeListItemsProvider を使用(現状維持)
  • コメント追加のみ

Option B: 含めない

  • セット商品は修復対象外
  • allSakeItemsProvider に変更
  • 通常の酒データのみ修復

どちらを選ぶべきか:

  • 推奨: Option A含める
    • セット商品も解析情報が必要なため
    • 包括的なデータメンテナンスが可能

🎯 まとめ

すぐにやるべきこと(必須)

  1. Matrix4 deprecated 移行 - 視覚的バグのリスクが高い
  2. ExpansionTileController 移行 - UI動作に影響

任意でやること(推奨)

  1. rawSakeListItemsProvider コメント追加 - 将来の誤変更防止

実機テストは必須

  • エミュレータだけでは不十分
  • 実機でタッチ操作・アニメーションを確認

推定時間

  • 最小: 2時間修正 + 実機テスト)
  • 最大: 3時間完全な受け入れテスト含む

作成者: Claude (Sonnet 4.5) 作成日時: 2026年2月4日 対象バージョン: v1.0.11+22 → v1.0.12