12 KiB
Ponshu Room Lite - 友人配布前の包括的コード改善(実行指示)
ミッション
このプロジェクトを友人配布可能な品質に引き上げるため、以下を実行してください:
- Critical/Highバグの発見と修正
- パフォーマンス最適化の実装
- コード品質のリファクタリング
- 私たちが見落としている改善提案
- iOS配布準備の事前検証
プロジェクト概要
- アプリ名: Ponshu Room Lite(日本酒コレクション管理アプリ)
- 現在バージョン: v1.0.10+19
- 配布計画:
- 優先: Android版(友人配布用APKビルド済み)
- 次段階: iOS版(2017 MacBook Airで環境構築予定)
- 状態管理: Riverpod 2.x
- 主要機能: OCRラベル認識、Google Drive同期、MBTI診断、スマートレコメンド
Phase D6 完了状況(最新実装)
実装完了内容:
filteredByModeProviderを新規作成(モード別フィルタリングを一元化)- データフロー:
rawSakeListItemsProvider→filteredByModeProvider→allSakeItemsProvider/sakeListProvider - Personal Mode: セット商品(
ItemType.set)と未分析品(isPendingAnalysis)を除外 - Business Mode: 全アイテム表示
修正完了箇所:
lib/providers/sake_list_provider.dart:68lib/screens/sake_detail_screen.dart:76lib/widgets/sake_search_delegate.dart:48
【CRITICAL】必須修正項目(即実行)
1. 非同期処理の安全性バグ修正
問題: use_build_context_synchronously警告が複数箇所で発生
実行指示:
- 以下のファイルで
if (!mounted) return;が欠けている箇所をすべて修正lib/screens/camera_screen.dartlib/screens/scan_screen.dartlib/screens/sake_detail_screen.dart- その他async関数内で
contextを使用する全箇所
- 修正パターン:
// ❌ 修正前
await someAsyncOperation();
if (context.mounted) {
Navigator.pop(context);
}
// ✅ 修正後
await someAsyncOperation();
if (!mounted) return;
Navigator.pop(context);
期待結果: use_build_context_synchronously警告を0件に削減
2. Phase D6フィルタリングの完全性検証と修正
実行指示:
rawSakeListItemsProviderへの直接参照を全ファイルで検索- 以下の箇所で誤った参照があれば修正:
- ホーム画面(
home_screen.dart) - 検索機能(
sake_search_delegate.dart) - レコメンド機能(
sake_recommendation_service.dart) - MBTI診断(
sommelier_screen.dart) - 統計/バッジ(
gamification_service.dart)
- ホーム画面(
- 修正方針:
rawSakeListItemsProvider→filteredByModeProviderまたはallSakeItemsProvider
期待結果: Personal Modeでセット商品が完全に非表示
3. Pro/Lite版の機能ロック抜け穴修正
実行指示:
IS_PRO_VERSIONチェックが欠けている箇所を検索:- Google Drive同期機能(
lib/services/google_drive_service.dart) - MBTI診断画面(
lib/screens/placeholders/sommelier_screen.dart) - 高度な統計機能(
lib/widgets/gamification/activity_stats.dart)
- Google Drive同期機能(
- Lite版でアクセスされた場合、Pro版誘導ダイアログを表示するコードを追加
期待結果: Lite版で有料機能が完全にロック
【HIGH】パフォーマンス最適化(実装推奨)
4. ギャラリー画像圧縮の実装
現状: カメラ撮影のみ圧縮済み、ギャラリー選択は未実装
実行指示:
lib/screens/camera_screen.dartの圧縮ロジックを参考に実装- 対象ファイル: ギャラリー選択を行う全画面
- 圧縮設定: 品質85%、最大幅1200px(カメラと同一)
- エラーハンドリング: 圧縮失敗時は元画像を使用
期待結果: ギャラリー画像も自動圧縮、ストレージ消費を50%削減
5. 不要なProvider再計算の最適化
実行指示:
- 以下のProviderで不要な再計算が発生していないか検証:
sakeListProvider(ソート処理が毎フレーム実行されていないか)allSakeItemsProvider(フィルタ処理の効率化)
- 必要に応じて以下を適用:
family修飾子でパラメータキャッシュautoDisposeの適切な使用- メモ化(
useMemoized)の追加
期待結果: ホーム画面のスクロール時CPU使用率を20%削減
6. 画像キャッシュの最適化
実行指示:
cached_network_imageパッケージの使用状況を確認- ローカル画像の
FileImageキャッシュが適切か検証 - 必要に応じて以下を実装:
- メモリキャッシュサイズの調整
- ディスクキャッシュの有効期限設定
- サムネイル用の低解像度キャッシュ
期待結果: 画像表示の体感速度向上、メモリ使用量削減
【MEDIUM】コード品質改善(リファクタリング)
7. 重複コードの削減
実行指示:
- 以下のパターンを検索し、共通関数化:
- Pro版ロックダイアログ表示(複数画面で重複)
- エラーSnackBar表示(統一されていない可能性)
- Google Drive同期エラーハンドリング
- 共通ユーティリティを
lib/utils/に配置
期待結果: コード行数を10%削減、保守性向上
8. マジックナンバーの定数化
実行指示:
- ハードコードされた数値を検索:
- 画像圧縮品質(85)
- 画像最大幅(1200)
- MBTI診断の最小件数(5)
- レコメンド表示件数(10)
lib/constants/app_constants.dartに定数として定義
期待結果: 設定変更が容易、可読性向上
9. 型安全性の向上
実行指示:
dynamic型の使用箇所を検索し、具体的な型に修正asキャストをisチェック+安全キャストに置き換え- null安全性の改善(不要な
?の削除、!の検証)
期待結果: ランタイムエラーリスクを削減
【未言及の改善提案】新規発見事項
10. アクセシビリティの検証
実行指示:
- 以下を確認し、不足があれば追加:
Semanticsウィジェットの使用(スクリーンリーダー対応)- 最小タップ領域(48x48 Material Design推奨)
- コントラスト比(WCAG AA基準)
- フォントスケーリング対応(MediaQuery.textScaleFactor)
期待結果: 障害者対応、将来的なストア審査対策
11. エラーログとクラッシュレポート
実行指示:
- 以下のエラーハンドリングが適切か検証:
- try-catchブロックの網羅性
- エラーメッセージのユーザーフレンドリー化
- 開発者向けログ出力(
debugPrintの使用)
- 将来的なFirebase Crashlytics統合の準備(コメントで指摘)
期待結果: ユーザー配布後の問題追跡が容易
12. メモリリーク検出
実行指示:
- 以下をチェック:
StreamControllerのdispose漏れAnimationControllerのdispose漏れ- 巨大なリストのメモリ保持(
ListView.builderの使用状況) - 画像のdispose処理
期待結果: 長時間使用時のメモリ安定性向上
13. ネットワークエラーハンドリング
実行指示:
- Google Drive API呼び出しで以下を検証:
- タイムアウト設定の適切性
- リトライロジックの有無
- オフライン時のユーザーへの通知
- 部分的な同期失敗の処理
期待結果: ネットワーク不安定時のUX向上
14. 【重要】iOS互換性の事前検証
背景: 2017 MacBook Airでの環境構築を予定、Android配布後にiOS対応
実行指示:
14-1. iOS設定ファイルの検証
以下のファイルを確認し、不足・誤設定があれば具体的に指摘:
-
Firebase設定(必須)
ios/Runner/GoogleService-Info.plistの存在確認- 内容が正しいか検証(BUNDLE_IDが一致しているか)
- Firebase ConsoleでiOSアプリ登録が必要か判定
-
権限記述(必須)
ios/Runner/Info.plistに以下が記載されているか:<key>NSCameraUsageDescription</key> <string>日本酒ラベルの撮影に使用します</string> <key>NSPhotoLibraryUsageDescription</key> <string>日本酒の写真をギャラリーから選択します</string>
-
Google Sign-In設定(必須)
ios/Runner/Info.plistにCFBundleURLSchemesが設定されているかREVERSED_CLIENT_IDが正しく記載されているか
14-2. プラットフォーム分岐コードの検証
以下を検索し、iOS未対応の箇所を列挙:
Platform.isAndroidのみ存在し、Platform.isIOSが欠けている箇所- Android固有APIの使用(
MethodChannel経由のネイティブコード) - パス区切り文字のハードコード(
/ではなくpathパッケージ使用が必須)
14-3. 依存パッケージのiOS互換性
以下のパッケージがiOSで動作するか検証:
google_mlkit_text_recognition(iOS対応確認)google_sign_in(iOS設定の完全性)image_picker(iOS権限設定)shared_preferences(iOS対応確認)sqflite(iOS対応確認)
14-4. ビルド制約の確認
2017 MacBook Air(macOS最大Big Sur 11.x)での制約を評価:
ios/Podfileのプラットフォーム設定(platform :ios, '12.0'など)- 最新Xcodeバージョン要求の有無
- CocoaPodsの互換性
期待結果:
- iOS環境構築時の必要作業リスト
- 致命的な互換性問題の早期発見
- Android実装への影響の有無判定
15. セキュリティ検証
実行指示:
- 以下をチェック:
- APIキー・シークレットのハードコード有無
- ユーザーデータの暗号化状態
- ログ出力に機密情報が含まれていないか
- SQLインジェクション対策(もしDB使用している場合)
期待結果: セキュリティリスクの事前排除
実行ガイドライン
修正の優先順位
- CRITICAL: 即座に修正(バグ、クラッシュリスク)
- HIGH: 配布前に実装推奨(パフォーマンス、UX)
- MEDIUM: 時間があれば実装(保守性、将来対策)
破壊的変更の扱い
- 許可: バグ修正、パフォーマンス最適化
- 要相談: アーキテクチャ変更、大規模リファクタリング
- 禁止: 機能削除、既存動作の変更(Phase D6実装は維持)
出力形式
以下の形式で報告してください:
## 修正実行結果
### CRITICAL修正(即実行済み)
1. [項目名]
- 修正箇所: [ファイルパス:行番号]
- 変更内容: [具体的な修正]
- 影響範囲: [どの機能に影響するか]
### HIGH修正(実装済み)
...
### MEDIUM修正(実装済み)
...
### 新規発見事項
...
### iOS互換性検証結果
- 必須対応事項: [環境構築前に解決すべき問題]
- 推奨対応事項: [iOS品質向上のための改善]
- Android実装への影響: [あり/なし + 詳細]
### 未修正の推奨事項
...
### 修正不要と判断した項目
...
## 総合評価
- 修正前の評価: [1-10点]
- 修正後の評価: [1-10点]
- Android配布可否判断: [Go/No-Go + 理由]
- iOS準備の難易度: [Easy/Medium/Hard + 理由]
R8無効化について(判断保留)
現状: isMinifyEnabled = false(意図的な無効化)
理由: Google Drive API、Firebase、画像処理ライブラリとの互換性懸念
実行指示:
- R8有効化した場合のリスク評価のみ実施
- 実際の有効化は実行しない(ビルドエラーリスクが高い)
- ProGuardルール追加で対応可能か検証
最終確認
このプロンプト実行後、以下が達成されることを期待:
✅ Criticalバグが0件
✅ flutter analyzeの警告が50%削減
✅ メモリ使用量が20%削減
✅ Android配布可否の明確な判断材料
✅ iOS準備の完全なロードマップ
✅ 手戻り防止のための互換性問題リスト