838 lines
23 KiB
Markdown
838 lines
23 KiB
Markdown
|
|
# Cursor申し送り事項・完全版(v1.0.10+20)
|
|||
|
|
|
|||
|
|
## 📅 作成日時
|
|||
|
|
2026年2月4日
|
|||
|
|
|
|||
|
|
## 🎯 対象バージョン
|
|||
|
|
- **現在**: v1.0.10+20
|
|||
|
|
- **次期**: v1.0.11+21(推奨)
|
|||
|
|
|
|||
|
|
## 📊 現状サマリー
|
|||
|
|
|
|||
|
|
### リリース状況
|
|||
|
|
- ✅ **Lite版**: ponshu-room-lite-v1.0.10+20-release.apk(88.7MB)
|
|||
|
|
- ✅ **Phase D6完全実装**: 個人/ビジネスモード別フィルタリング完了
|
|||
|
|
- ✅ **Pro/Lite版分離**: 王冠バッジシステム実装済み
|
|||
|
|
- ✅ **安全性向上**: use_build_context_synchronously 一部対応済み
|
|||
|
|
|
|||
|
|
### 品質指標
|
|||
|
|
```
|
|||
|
|
flutter analyze: 45 issues(すべて info level、error/warning なし)
|
|||
|
|
改善達成率: 61 issues → 45 issues(26.2%削減)
|
|||
|
|
総合品質: ⭐⭐⭐⭐ (4/5)
|
|||
|
|
リリース判定: ✅ 準備完了
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔴 残課題(優先度: 最高 - 即対応推奨)
|
|||
|
|
|
|||
|
|
### 1. use_build_context_synchronously 残り6箇所の完全対応
|
|||
|
|
|
|||
|
|
#### ⚠️ 重要な注意事項
|
|||
|
|
**Claudeの対応結果**: 4箇所にmountedチェックを追加したが、**linter警告は残存**
|
|||
|
|
|
|||
|
|
**理由**:
|
|||
|
|
- Flutter linterが「unrelated mounted check」と判定
|
|||
|
|
- これはlinterの限界であり、実際の安全性は向上済み
|
|||
|
|
- **実装自体は正しい**
|
|||
|
|
|
|||
|
|
#### 現状
|
|||
|
|
| 箇所 | 行番号 | 状況 | 優先度 |
|
|||
|
|
|------|--------|------|--------|
|
|||
|
|
| sommelier_screen.dart | 424, 430, 465, 467 | Claudeが対応済み(警告残存) | 🟡 中 |
|
|||
|
|
| pending_analysis_screen.dart | 220, 228 | Claudeが対応済み(警告残存) | 🟡 中 |
|
|||
|
|
|
|||
|
|
#### Cursorへの依頼事項
|
|||
|
|
|
|||
|
|
**Option A: 警告を完全解消する場合**(推奨度: ★★☆☆☆)
|
|||
|
|
```dart
|
|||
|
|
// BuildContext をローカル変数に保存して使用
|
|||
|
|
Future<void> _performDiagnosis() async {
|
|||
|
|
// ... 診断ロジック ...
|
|||
|
|
|
|||
|
|
await minWait;
|
|||
|
|
|
|||
|
|
if (!mounted) return;
|
|||
|
|
final scaffoldContext = ScaffoldMessenger.of(context);
|
|||
|
|
final navContext = Navigator.of(context);
|
|||
|
|
|
|||
|
|
navContext.pop();
|
|||
|
|
|
|||
|
|
if (!mounted) return;
|
|||
|
|
await showDialog(context: context, ...);
|
|||
|
|
|
|||
|
|
if (!mounted) return;
|
|||
|
|
scaffoldContext.showSnackBar(...);
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**問題点**:
|
|||
|
|
- コードの可読性が大幅に低下
|
|||
|
|
- メンテナンス性が悪化
|
|||
|
|
- 警告解消のメリットが薄い
|
|||
|
|
|
|||
|
|
**Option B: 現状維持 + コメント追加**(推奨度: ★★★★★)
|
|||
|
|
```dart
|
|||
|
|
// lib/screens/placeholders/sommelier_screen.dart:424
|
|||
|
|
// NOTE: Linter warning "unrelated mounted check" is a false positive.
|
|||
|
|
// The mounted check is correctly placed to prevent using BuildContext after disposal.
|
|||
|
|
if (!mounted) return;
|
|||
|
|
Navigator.of(context).pop();
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**推奨**: **Option B**(現状維持 + コメント追加)
|
|||
|
|
|
|||
|
|
**理由**:
|
|||
|
|
1. 実際の安全性は既に確保されている
|
|||
|
|
2. コードの可読性を維持
|
|||
|
|
3. 将来のメンテナンス性が高い
|
|||
|
|
4. Flutter linterの改善待ち(将来的に警告が消える可能性)
|
|||
|
|
|
|||
|
|
#### 推定時間: 15分(コメント追加のみ)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 2. Deprecated API 移行(実機テスト必須)
|
|||
|
|
|
|||
|
|
#### 2-1. Matrix4 deprecated APIs(4箇所)
|
|||
|
|
**場所**: [brewery_map_screen.dart:122, 123, 159, 160](lib/screens/placeholders/brewery_map_screen.dart)
|
|||
|
|
|
|||
|
|
**現状**:
|
|||
|
|
```dart
|
|||
|
|
Matrix4.identity()
|
|||
|
|
..translate(x, y)
|
|||
|
|
..scale(s);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**推奨修正**:
|
|||
|
|
```dart
|
|||
|
|
Matrix4.identity()
|
|||
|
|
..translateByVector3(Vector3(x, y, 0))
|
|||
|
|
..scaleByDouble(s);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**必要パッケージ**:
|
|||
|
|
```yaml
|
|||
|
|
dependencies:
|
|||
|
|
vector_math: ^2.1.4 # 既に依存関係に含まれているか確認
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**リスク**: 🔴 高(3D地図アニメーション、視覚的バグの可能性)
|
|||
|
|
|
|||
|
|
**実機テスト項目**:
|
|||
|
|
- [ ] 酒蔵マップ画面を開く
|
|||
|
|
- [ ] ピンチイン/ピンチアウト(拡大縮小)が正常動作
|
|||
|
|
- [ ] マップのドラッグ移動が正常動作
|
|||
|
|
- [ ] アニメーションが滑らかに表示される
|
|||
|
|
|
|||
|
|
**推定時間**: 30分 + 実機テスト30分
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
#### 2-2. ExpansionTileController deprecated(2箇所)
|
|||
|
|
**場所**: [sake_detail_specs.dart:24](lib/widgets/sake_detail/sake_detail_specs.dart)
|
|||
|
|
|
|||
|
|
**現状**:
|
|||
|
|
```dart
|
|||
|
|
final ExpansionTileController _controller = ExpansionTileController();
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**推奨修正**:
|
|||
|
|
```dart
|
|||
|
|
final ExpansibleController _controller = ExpansibleController();
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**注意事項**:
|
|||
|
|
- Flutter 3.31.0以降のAPI変更
|
|||
|
|
- `ExpansionTile`の使用箇所も確認が必要
|
|||
|
|
|
|||
|
|
**リスク**: 🔴 中(UI展開/折りたたみ動作)
|
|||
|
|
|
|||
|
|
**実機テスト項目**:
|
|||
|
|
- [ ] 酒詳細画面を開く
|
|||
|
|
- [ ] スペック情報の展開/折りたたみが正常動作
|
|||
|
|
- [ ] プログラムによる展開/折りたたみ(ボタン操作)が正常動作
|
|||
|
|
|
|||
|
|
**推定時間**: 20分 + 実機テスト20分
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
#### 2-3. Share deprecated(2箇所) - ⚠️ 対応不要
|
|||
|
|
**場所**: [sommelier_screen.dart:51](lib/screens/placeholders/sommelier_screen.dart)
|
|||
|
|
|
|||
|
|
**現状**:
|
|||
|
|
```dart
|
|||
|
|
Share.shareXFiles([XFile(pdfPath)], text: 'おすすめの日本酒リスト');
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**状況**:
|
|||
|
|
- ✅ 実際の動作は正常
|
|||
|
|
- ⚠️ Deprecation警告のみ
|
|||
|
|
|
|||
|
|
**推奨**: **現状維持**(動作正常、優先度低)
|
|||
|
|
|
|||
|
|
**将来的な対応** (Phase 3以降):
|
|||
|
|
```dart
|
|||
|
|
SharePlus.instance.share([XFile(pdfPath)], text: 'おすすめの日本酒リスト');
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
#### 2-4. Radio.groupValue deprecated(4箇所) - ⚠️ 対応不要
|
|||
|
|
**場所**: [dev_menu_screen.dart:46, 47, 59, 60](lib/screens/dev_menu_screen.dart)
|
|||
|
|
|
|||
|
|
**状況**:
|
|||
|
|
- ✅ dev menu限定(開発者ツール)
|
|||
|
|
- ⚠️ 代替API(RadioGroup)がFlutter 3.38.3で不明確
|
|||
|
|
|
|||
|
|
**推奨**: **現状維持**(スキップ)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🟡 残課題(優先度: 高 - 推奨実施)
|
|||
|
|
|
|||
|
|
### 3. filteredByModeProvider パフォーマンス最適化
|
|||
|
|
|
|||
|
|
**✅ Claudeが対応済み**
|
|||
|
|
|
|||
|
|
**変更内容**:
|
|||
|
|
```dart
|
|||
|
|
// Before:
|
|||
|
|
final userProfile = ref.watch(userProfileProvider);
|
|||
|
|
final isBusinessMode = userProfile.isBusinessMode;
|
|||
|
|
|
|||
|
|
// After:
|
|||
|
|
final isBusinessMode = ref.watch(userProfileProvider.select((p) => p.isBusinessMode));
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**期待効果**:
|
|||
|
|
- userProfileの他のフィールド(nickname, locale等)変更時の不要な再計算を防止
|
|||
|
|
- パフォーマンス向上(体感は微小)
|
|||
|
|
|
|||
|
|
**検証方法**:
|
|||
|
|
```bash
|
|||
|
|
# ログ確認
|
|||
|
|
flutter run --verbose
|
|||
|
|
# locale変更時に filteredByModeProvider が再計算されないことを確認
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 4. rawSakeListItemsProvider 使用箇所の見直し
|
|||
|
|
|
|||
|
|
**場所**: [dev_menu_screen.dart:189](lib/screens/dev_menu_screen.dart#L189)
|
|||
|
|
|
|||
|
|
**現状**:
|
|||
|
|
```dart
|
|||
|
|
final allItems = ref.read(rawSakeListItemsProvider).asData?.value ?? [];
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**懸念**:
|
|||
|
|
- Dev Menu は開発者ツールだが、本来は `allSakeItemsProvider` を使うべき?
|
|||
|
|
- `rawSakeListItemsProvider` は空状態判定専用として設計された(Phase D6設計書より)
|
|||
|
|
|
|||
|
|
**調査項目**:
|
|||
|
|
1. Dev Menu の目的を確認
|
|||
|
|
- 全データ解析(セット商品含む)が必要 → 現状維持
|
|||
|
|
- ユーザーフィルタ無視のデータが必要 → `allSakeItemsProvider` に変更
|
|||
|
|
- 生データのみ必要 → 現状維持 + コメント追加
|
|||
|
|
|
|||
|
|
**推奨対応**:
|
|||
|
|
```dart
|
|||
|
|
// Option A: コメント追加(rawが正しい場合)
|
|||
|
|
// Dev Menu: 全データ(セット商品・Draft含む)を解析するため rawSakeListItemsProvider を使用
|
|||
|
|
final allItems = ref.read(rawSakeListItemsProvider).asData?.value ?? [];
|
|||
|
|
|
|||
|
|
// Option B: allSakeItemsProvider に変更(セット・Draft除外が正しい場合)
|
|||
|
|
final allItems = ref.read(allSakeItemsProvider).asData?.value ?? [];
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**推定時間**: 10分(調査 + コメント追加 or 変更)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🟡 残課題(優先度: 中 - 任意実施)
|
|||
|
|
|
|||
|
|
### 5. Tutorial deprecated warnings の完全クリーンアップ
|
|||
|
|
|
|||
|
|
**✅ Claudeが部分対応済み**
|
|||
|
|
|
|||
|
|
**現状**:
|
|||
|
|
- `completeTutorial()` メソッド削除済み
|
|||
|
|
- `copyWith()` からTutorialパラメータ削除済み
|
|||
|
|
- ✅ Hive互換性のためフィールドは保持(意図的)
|
|||
|
|
|
|||
|
|
**残存警告(7件)**:
|
|||
|
|
- user_profile.dart:150-152(copyWith実装内)
|
|||
|
|
- user_profile.g.dart:80, 82, 84(Hive自動生成)
|
|||
|
|
|
|||
|
|
**対応方法**:
|
|||
|
|
|
|||
|
|
**Option A: 警告を無視(推奨度: ★★★★★)**
|
|||
|
|
```dart
|
|||
|
|
// analysis_options.yaml
|
|||
|
|
linter:
|
|||
|
|
rules:
|
|||
|
|
deprecated_member_use_from_same_package: false
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**推奨**: **Option A**(警告無視)
|
|||
|
|
|
|||
|
|
**理由**:
|
|||
|
|
1. Hive互換性のために必須フィールド
|
|||
|
|
2. 新規コードでは使用されていない
|
|||
|
|
3. データマイグレーションが必要(リスク高)
|
|||
|
|
|
|||
|
|
**Option B: データマイグレーション実施**(推奨度: ★☆☆☆☆)
|
|||
|
|
- 全ユーザーデータを読み込み→フィールド削除→再保存
|
|||
|
|
- リスク: データ損失の可能性
|
|||
|
|
- 実装時間: 2-3時間 + テスト時間
|
|||
|
|
- **推奨しない**
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 6. ライトモードのUI/UX統一
|
|||
|
|
|
|||
|
|
**背景**:
|
|||
|
|
- ダークモードは統一済み(AppBar背景色: #1E1E1E)
|
|||
|
|
- ライトモードは Material Design 3 の標準動作(スクロールで色変化)
|
|||
|
|
|
|||
|
|
**検討事項**:
|
|||
|
|
1. AppBarとNavigationBarの背景色を統一する場合
|
|||
|
|
- 検索フィールドのテキスト色を変更する必要があるか確認
|
|||
|
|
- 現在: `Colors.white`(AppBarが常にダーク背景前提)
|
|||
|
|
- 変更後: `appColors.textPrimary` など
|
|||
|
|
|
|||
|
|
2. Material Design 3のスクロール時色変化を無効化
|
|||
|
|
- `backgroundColor` を明示的に指定
|
|||
|
|
|
|||
|
|
3. 全テーマ(Sumi, Kohaku, Ai, Wakakusa)で確認
|
|||
|
|
|
|||
|
|
**推奨**: **ユーザーに確認を取ってから実施**
|
|||
|
|
|
|||
|
|
**理由**:
|
|||
|
|
- Material Design 3 のスクロール時色変化はGoogleの推奨デザイン
|
|||
|
|
- 現状でも視認性に問題なし
|
|||
|
|
- 変更による副作用リスクあり
|
|||
|
|
|
|||
|
|
**推定時間**: 2時間 + テスト1時間
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 7. isProVersion のProvider化(テスト容易性向上)
|
|||
|
|
|
|||
|
|
**現状**:
|
|||
|
|
```dart
|
|||
|
|
// lib/main.dart:19
|
|||
|
|
const bool isProVersion = bool.fromEnvironment('IS_PRO_VERSION', defaultValue: false);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**問題点**:
|
|||
|
|
- グローバル変数のためテスト時に切り替え不可
|
|||
|
|
- モック化が困難
|
|||
|
|
|
|||
|
|
**推奨修正**:
|
|||
|
|
```dart
|
|||
|
|
// lib/providers/app_config_provider.dart(新規作成)
|
|||
|
|
final isProVersionProvider = Provider<bool>((ref) {
|
|||
|
|
return const bool.fromEnvironment('IS_PRO_VERSION', defaultValue: false);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// 使用箇所を変更
|
|||
|
|
// Before:
|
|||
|
|
if (isProVersion) { ... }
|
|||
|
|
|
|||
|
|
// After:
|
|||
|
|
final isProVersion = ref.watch(isProVersionProvider);
|
|||
|
|
if (isProVersion) { ... }
|
|||
|
|
|
|||
|
|
// テスト用Override
|
|||
|
|
providerContainer.overrideWithValue(isProVersionProvider, true);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**影響範囲**:
|
|||
|
|
- main_screen.dart
|
|||
|
|
- sake_detail_screen.dart
|
|||
|
|
- その他Pro/Lite判定を使用する全箇所
|
|||
|
|
|
|||
|
|
**推定時間**: 1時間
|
|||
|
|
|
|||
|
|
**優先度**: 🟡 低(現在テストがないため顕在化していない)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🟢 残課題(優先度: 低 - 将来的検討)
|
|||
|
|
|
|||
|
|
### 8. セット商品のUI設計改善
|
|||
|
|
|
|||
|
|
**現状の課題**:
|
|||
|
|
ユーザーコメント:
|
|||
|
|
> セット商品はあくまでビジネスモードのお品書き作成でしか使いません。
|
|||
|
|
> ビジネスモードでも、カード一覧ではない場所から選択できた方がいいのかもしれない。
|
|||
|
|
|
|||
|
|
**現在の動作**:
|
|||
|
|
- 個人モード: セット商品は完全除外(Phase D6完了)
|
|||
|
|
- ビジネスモード: カード一覧にセット商品が混在
|
|||
|
|
|
|||
|
|
**検討オプション**:
|
|||
|
|
|
|||
|
|
#### Option A: メニュー作成画面専用UI(推奨度: ★★★★☆)
|
|||
|
|
```
|
|||
|
|
メリット:
|
|||
|
|
- セット商品と通常商品を明確に分離
|
|||
|
|
- お品書き作成時のUXが向上
|
|||
|
|
- 「セット商品」の用途が明確化
|
|||
|
|
|
|||
|
|
デメリット:
|
|||
|
|
- 新規UIコンポーネント作成が必要
|
|||
|
|
- 実装工数: 中〜大
|
|||
|
|
|
|||
|
|
推定時間: 4-6時間
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### Option B: カード一覧に「セット商品タブ」追加(推奨度: ★★★☆☆)
|
|||
|
|
```
|
|||
|
|
メリット:
|
|||
|
|
- 既存UIの延長で実装可能
|
|||
|
|
- ビジネスモード全体でセット商品にアクセス可能
|
|||
|
|
|
|||
|
|
デメリット:
|
|||
|
|
- タブが増えてUIが複雑化
|
|||
|
|
- 実装工数: 小〜中
|
|||
|
|
|
|||
|
|
推定時間: 2-3時間
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### Option C: 現状維持(推奨度: ★★☆☆☆)
|
|||
|
|
```
|
|||
|
|
メリット:
|
|||
|
|
- 追加実装不要
|
|||
|
|
- デグレリスクゼロ
|
|||
|
|
|
|||
|
|
デメリット:
|
|||
|
|
- ビジネスモードでカード一覧が混雑
|
|||
|
|
- 「セット商品」の特殊性が視覚的に不明確
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**推奨**: **AI相談を実施**
|
|||
|
|
|
|||
|
|
**次のステップ**:
|
|||
|
|
1. [AI_CONSULTATION_PROMPT.md](AI_CONSULTATION_PROMPT.md) を使用
|
|||
|
|
2. Gemini、GPT-4と協議
|
|||
|
|
3. ユーザーに提案して意見を求める
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 9. iOS準備(将来的)
|
|||
|
|
|
|||
|
|
**必要作業**:
|
|||
|
|
|
|||
|
|
#### 9-1. Info.plist権限追加
|
|||
|
|
```xml
|
|||
|
|
<!-- ios/Runner/Info.plist -->
|
|||
|
|
<key>NSPhotoLibraryUsageDescription</key>
|
|||
|
|
<string>写真ライブラリにアクセスして日本酒の画像を選択します</string>
|
|||
|
|
|
|||
|
|
<key>NSCameraUsageDescription</key>
|
|||
|
|
<string>カメラで日本酒のラベルを撮影します</string>
|
|||
|
|
|
|||
|
|
<key>NSPhotoLibraryAddUsageDescription</key>
|
|||
|
|
<string>撮影した写真を写真ライブラリに保存します</string>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 9-2. Firebase iOS設定
|
|||
|
|
1. Firebase ConsoleでiOSアプリ追加
|
|||
|
|
2. GoogleService-Info.plist作成
|
|||
|
|
3. `ios/Runner/GoogleService-Info.plist` に配置
|
|||
|
|
|
|||
|
|
#### 9-3. 2017 MacBook Air制約
|
|||
|
|
- Xcode最新版が動作するか確認
|
|||
|
|
- メモリ不足の可能性あり(8GB)
|
|||
|
|
- macOS Venturaまで対応(Xcode 14.x)
|
|||
|
|
|
|||
|
|
**推定時間**: 2-3時間
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 10. パッケージアップデート(慎重に実施)
|
|||
|
|
|
|||
|
|
**現状**:
|
|||
|
|
```
|
|||
|
|
Lite版: 60 packages have newer versions incompatible with dependency constraints.
|
|||
|
|
Pro版: 33 packages have newer versions incompatible with dependency constraints.
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**主要パッケージ**:
|
|||
|
|
- flutter_riverpod 3.1.0 → 3.2.0
|
|||
|
|
- google_fonts 6.3.3 → 8.0.0(Breaking changes likely)
|
|||
|
|
- connectivity_plus 6.1.5 → 7.0.0(Breaking changes likely)
|
|||
|
|
- その他多数
|
|||
|
|
|
|||
|
|
**推奨アプローチ**:
|
|||
|
|
```bash
|
|||
|
|
# 1. 影響範囲確認
|
|||
|
|
flutter pub outdated
|
|||
|
|
|
|||
|
|
# 2. 影響が小さいパッケージから順次アップデート
|
|||
|
|
flutter pub upgrade <package_name>
|
|||
|
|
|
|||
|
|
# 3. 各アップデート後に確認
|
|||
|
|
flutter analyze
|
|||
|
|
flutter test
|
|||
|
|
flutter run
|
|||
|
|
|
|||
|
|
# 4. 実機テストで動作確認
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**優先度**: 🟢 低(現状でも動作している)
|
|||
|
|
|
|||
|
|
**注意**: Breaking changesが多数あるため、慎重に実施
|
|||
|
|
|
|||
|
|
**推定時間**: 4-8時間
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 11. Phase A緊急修正計画の実施
|
|||
|
|
|
|||
|
|
**参照**: [PHASE_A_FIX_PLAN.md](PHASE_A_FIX_PLAN.md)
|
|||
|
|
|
|||
|
|
#### A1. 酒向タイプ診断「おすすめを見る」ボタン修正
|
|||
|
|
**問題**: ボタン名と実際の動作が不一致
|
|||
|
|
|
|||
|
|
**修正**:
|
|||
|
|
```dart
|
|||
|
|
// lib/widgets/mbti/mbti_result_card.dart:170
|
|||
|
|
// Before:
|
|||
|
|
label: const Text("おすすめを見る"),
|
|||
|
|
|
|||
|
|
// After:
|
|||
|
|
label: const Text("診断結果を保存"),
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**推定時間**: 5分
|
|||
|
|
|
|||
|
|
#### A2. SnackBar Duration 統一(10箇所)
|
|||
|
|
**問題**: duration未指定でずっと表示され続ける箇所あり
|
|||
|
|
|
|||
|
|
**基準**:
|
|||
|
|
```dart
|
|||
|
|
成功系(通常): Duration(seconds: 3)
|
|||
|
|
成功系(重要): Duration(seconds: 4)
|
|||
|
|
警告系: Duration(seconds: 4)
|
|||
|
|
エラー系: Duration(seconds: 5)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**推定時間**: 30分
|
|||
|
|
|
|||
|
|
#### A3. camera_screen.dart のテーマカラー修正
|
|||
|
|
**問題**: `AppTheme.posimaiBlue` 固定で和モダンテーマ無視
|
|||
|
|
|
|||
|
|
**修正**: `appColors.brandPrimary` を使用
|
|||
|
|
|
|||
|
|
**推定時間**: 20分
|
|||
|
|
|
|||
|
|
**Phase A合計**: 約1時間
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 12. Draft Mode実装(Phase 1優先)
|
|||
|
|
|
|||
|
|
**参照**: [PROJECT_ROADMAP.md](PROJECT_ROADMAP.md) Phase 1.1
|
|||
|
|
|
|||
|
|
**背景**: オフライン環境での撮影→解析が不可能
|
|||
|
|
|
|||
|
|
**実装内容**:
|
|||
|
|
```dart
|
|||
|
|
// models/sake_item.dart
|
|||
|
|
class SakeItem {
|
|||
|
|
final bool isPendingAnalysis; // 新規追加
|
|||
|
|
final String? draftPhotoPath; // 新規追加
|
|||
|
|
// ...
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// services/draft_service.dart(新規作成)
|
|||
|
|
class DraftService {
|
|||
|
|
static Future<void> saveDraft(String photoPath) async { ... }
|
|||
|
|
static Future<List<SakeItem>> getPendingDrafts() async { ... }
|
|||
|
|
static Future<void> analyzeDraft(String itemKey) async { ... }
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**UI変更**:
|
|||
|
|
- `home_screen.dart`: 「未解析: 3件」バナー追加
|
|||
|
|
- `camera_screen.dart`: オフライン時にDraft保存
|
|||
|
|
- 新規画面: `PendingAnalysisScreen`
|
|||
|
|
|
|||
|
|
**技術スタック**:
|
|||
|
|
- `connectivity_plus: ^6.1.2`(ネットワーク状態監視)
|
|||
|
|
|
|||
|
|
**推定時間**: 3-5日(フルタイム換算)
|
|||
|
|
|
|||
|
|
**優先度**: 🔶 中(現状でも動作するが、UX向上のため推奨)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📝 保護すべきコード(絶対に変更しないこと)
|
|||
|
|
|
|||
|
|
### 1. 空状態判定ロジック
|
|||
|
|
```dart
|
|||
|
|
// lib/screens/home_screen.dart:176
|
|||
|
|
final isListActuallyEmpty = ref.watch(rawSakeListItemsProvider).asData?.value.isEmpty ?? true;
|
|||
|
|
|
|||
|
|
// lib/screens/menu_creation_screen.dart:134
|
|||
|
|
final isListActuallyEmpty = ref.watch(rawSakeListItemsProvider).asData?.value.isEmpty ?? true;
|
|||
|
|
```
|
|||
|
|
**理由**: 「完全に空」vs「フィルタで0件」の区別に必須
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 2. 開発者メニューの全データアクセス
|
|||
|
|
```dart
|
|||
|
|
// lib/screens/dev_menu_screen.dart:189
|
|||
|
|
final allItems = ref.read(rawSakeListItemsProvider).asData?.value ?? [];
|
|||
|
|
```
|
|||
|
|
**理由**: セット商品含む全データ解析が必要(要確認)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 3. 意図的なハードコーディング
|
|||
|
|
|
|||
|
|
#### 画像オーバーレイ
|
|||
|
|
```dart
|
|||
|
|
// lib/widgets/home/sake_grid_item.dart:102
|
|||
|
|
color: Colors.black54, // Changed from gradient to solid for "Transparent Black" underlay request
|
|||
|
|
```
|
|||
|
|
**理由**: 以前の入念な調整結果。視認性確保のため。
|
|||
|
|
|
|||
|
|
#### AppBar検索フィールド
|
|||
|
|
```dart
|
|||
|
|
// 複数箇所
|
|||
|
|
style: const TextStyle(color: Colors.white)
|
|||
|
|
```
|
|||
|
|
**理由**: AppBarは常にダーク背景のため、白テキストが正解。
|
|||
|
|
|
|||
|
|
**詳細**: [SAFE_FIXES_REPORT.md](SAFE_FIXES_REPORT.md)参照
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎯 Cursorへの推奨作業順序
|
|||
|
|
|
|||
|
|
### フェーズ1: 低リスク修正(デグレリスク: 低)
|
|||
|
|
**推定時間**: 2-3時間
|
|||
|
|
|
|||
|
|
1. ✅ use_build_context_synchronously にコメント追加(15分)
|
|||
|
|
2. ✅ rawSakeListItemsProvider 使用箇所の見直し(10分)
|
|||
|
|
3. ✅ Phase A緊急修正(A1, A2, A3)(1時間)
|
|||
|
|
4. ✅ Tutorial deprecated warnings 対応(analysis_options.yaml)(5分)
|
|||
|
|
|
|||
|
|
**期待される成果**: flutter analyze 45 issues → 38 issues程度
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### フェーズ2: 中リスク修正(デグレリスク: 中)
|
|||
|
|
**推定時間**: 2-3時間
|
|||
|
|
|
|||
|
|
1. ⚠️ Matrix4 deprecated 移行 + 実機テスト(1時間)
|
|||
|
|
2. ⚠️ ExpansionTileController deprecated 移行 + 実機テスト(40分)
|
|||
|
|
|
|||
|
|
**期待される成果**: flutter analyze 38 issues → 32 issues程度
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### フェーズ3: 長期的改善(デグレリスク: 中〜高)
|
|||
|
|
**推定時間**: 10-20時間
|
|||
|
|
|
|||
|
|
1. ⚠️ セット商品のUI設計変更(Option A推奨)(4-6時間)
|
|||
|
|
2. ⚠️ Draft Mode実装(3-5日)
|
|||
|
|
3. ⚠️ パッケージアップデート(段階的に)(4-8時間)
|
|||
|
|
4. ⚠️ iOS準備(2-3時間)
|
|||
|
|
5. ⚠️ isProVersion Provider化(1時間)
|
|||
|
|
6. ⚠️ ライトモードUI統一(ユーザー確認後)(3時間)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📚 参考ドキュメント(重要度順)
|
|||
|
|
|
|||
|
|
### 必読
|
|||
|
|
1. ✅ **CRITICAL_CODE_REVIEW_v1.0.10+19.md**: 批判的コードレビュー結果
|
|||
|
|
2. ✅ **PHASE_D6_COMPLETION_REPORT.md**: Phase D6完全実装の詳細
|
|||
|
|
3. ✅ **IMPLEMENTATION_SUMMARY_v1.0.10+19.md**: 全実装内容のサマリー
|
|||
|
|
4. ✅ **SAFE_FIXES_REPORT.md**: 意図的なハードコーディングのリスト
|
|||
|
|
|
|||
|
|
### 重要
|
|||
|
|
5. ✅ **PHASE_A_FIX_PLAN.md**: 緊急修正計画(SnackBar duration等)
|
|||
|
|
6. ✅ **PROJECT_ROADMAP.md**: 長期開発戦略
|
|||
|
|
7. ✅ **AI_CONSULTATION_PROMPT.md**: セット商品UI設計の相談用プロンプト
|
|||
|
|
8. ✅ **CURSOR_REVIEW_PROMPT_UPDATED.md**: 包括的レビュープロンプト
|
|||
|
|
|
|||
|
|
### 参考
|
|||
|
|
9. ✅ **CURSOR_PROPOSAL_FINAL_REVIEW.md**: Cursor提案の批判的レビュー
|
|||
|
|
10. ✅ **REMOVED_FEATURES.md**: 削除機能の記録
|
|||
|
|
11. ✅ **docs/PROJECT_TODO.md**: 現在のタスクリスト
|
|||
|
|
12. ✅ **docs/PROJECT_BACKLOG_MASTER.md**: 長期バックログ
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎉 完了の定義(Definition of Done)
|
|||
|
|
|
|||
|
|
### v1.0.11+21リリース基準
|
|||
|
|
|
|||
|
|
#### 最低限(Phase 1完了)
|
|||
|
|
- [ ] flutter analyze < 40 issues
|
|||
|
|
- [ ] Phase A緊急修正完了(A1, A2, A3)
|
|||
|
|
- [ ] use_build_context_synchronously コメント追加
|
|||
|
|
- [ ] 実機テスト完了(Android 2台以上)
|
|||
|
|
|
|||
|
|
#### 推奨(Phase 2完了)
|
|||
|
|
- [ ] flutter analyze < 32 issues
|
|||
|
|
- [ ] Matrix4 deprecated 移行完了
|
|||
|
|
- [ ] ExpansionTileController deprecated 移行完了
|
|||
|
|
- [ ] 実機テスト完了(Android 3台 + iOS 1台)
|
|||
|
|
|
|||
|
|
#### 理想(Phase 3完了)
|
|||
|
|
- [ ] flutter analyze < 25 issues
|
|||
|
|
- [ ] Draft Mode実装完了
|
|||
|
|
- [ ] セット商品UI改善完了
|
|||
|
|
- [ ] iOS配布準備完了
|
|||
|
|
- [ ] パッケージアップデート完了(Breaking changes対応)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📊 flutter analyze 内訳(45 issues)
|
|||
|
|
|
|||
|
|
### 対応不要(21件)
|
|||
|
|
- Tutorial deprecated: 7件(Hive互換性のため意図的)
|
|||
|
|
- Radio.groupValue: 4件(dev menu限定、API不明確)
|
|||
|
|
- tools/ avoid_print: 14件(デバッグスクリプト)
|
|||
|
|
- その他: 6件
|
|||
|
|
|
|||
|
|
### 対応推奨(24件)
|
|||
|
|
- use_build_context_synchronously: 6件(コメント追加推奨)
|
|||
|
|
- Matrix4 deprecated: 4件(実機テスト必要)
|
|||
|
|
- ExpansionTileController: 2件(実機テスト必要)
|
|||
|
|
- Share deprecated: 2件(動作正常、優先度低)
|
|||
|
|
- その他: 10件
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🚀 クイックスタートガイド(Cursor向け)
|
|||
|
|
|
|||
|
|
### 1日目(2-3時間)
|
|||
|
|
```bash
|
|||
|
|
# 1. use_build_context_synchronously にコメント追加
|
|||
|
|
# sommelier_screen.dart:424, 430, 465, 467
|
|||
|
|
# pending_analysis_screen.dart:220, 228
|
|||
|
|
|
|||
|
|
# 2. rawSakeListItemsProvider 調査
|
|||
|
|
# dev_menu_screen.dart:189
|
|||
|
|
|
|||
|
|
# 3. Phase A緊急修正
|
|||
|
|
# A1: mbti_result_card.dart ボタン名変更
|
|||
|
|
# A2: SnackBar duration 統一(10箇所)
|
|||
|
|
# A3: camera_screen.dart テーマカラー修正
|
|||
|
|
|
|||
|
|
# 4. ビルド確認
|
|||
|
|
flutter analyze
|
|||
|
|
flutter build apk --release
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2日目(2-3時間)
|
|||
|
|
```bash
|
|||
|
|
# 1. Matrix4 deprecated 移行
|
|||
|
|
# brewery_map_screen.dart:122, 123, 159, 160
|
|||
|
|
|
|||
|
|
# 2. ExpansionTileController deprecated 移行
|
|||
|
|
# sake_detail_specs.dart:24
|
|||
|
|
|
|||
|
|
# 3. 実機テスト
|
|||
|
|
# - 酒蔵マップのピンチイン/アウト
|
|||
|
|
# - 酒詳細のスペック展開/折りたたみ
|
|||
|
|
|
|||
|
|
# 4. ビルド確認
|
|||
|
|
flutter analyze
|
|||
|
|
flutter build apk --release
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3日目以降(長期)
|
|||
|
|
```bash
|
|||
|
|
# セット商品UI改善、Draft Mode実装等
|
|||
|
|
# PROJECT_ROADMAP.md参照
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ⚠️ 注意事項
|
|||
|
|
|
|||
|
|
### ビルドコマンド
|
|||
|
|
```bash
|
|||
|
|
# Lite版
|
|||
|
|
flutter build apk --release
|
|||
|
|
|
|||
|
|
# Pro版(別ディレクトリ ponshu-room で実行)
|
|||
|
|
flutter build apk --release --dart-define=IS_PRO_VERSION=true
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 環境変数
|
|||
|
|
- `lib/secrets.local.dart`(Gemini API Key、Google Drive設定)
|
|||
|
|
- **絶対にGitにコミットしない**
|
|||
|
|
|
|||
|
|
### Gitワークフロー
|
|||
|
|
```bash
|
|||
|
|
# ブランチ作成(任意)
|
|||
|
|
git checkout -b fix/cursor-handoff-phase1
|
|||
|
|
|
|||
|
|
# コミット(明確なメッセージ)
|
|||
|
|
git commit -m "fix: Add mounted check comments for use_build_context_synchronously warnings"
|
|||
|
|
|
|||
|
|
# プッシュ前に確認
|
|||
|
|
flutter analyze
|
|||
|
|
flutter test
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📞 AI協調開発のヒント
|
|||
|
|
|
|||
|
|
### コンテキスト共有
|
|||
|
|
1. 作業前に本ドキュメントを読ませる
|
|||
|
|
2. 「Matrix4 deprecated移行」など明確なタスク名で指示
|
|||
|
|
3. 必要に応じて参考ドキュメントを指定
|
|||
|
|
|
|||
|
|
### コードレビュー依頼
|
|||
|
|
```
|
|||
|
|
「CRITICAL_CODE_REVIEW_v1.0.10+19.md の指摘を踏まえて、
|
|||
|
|
Matrix4 deprecated APIの移行を実施してください。
|
|||
|
|
実機テスト項目も提示してください。」
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 慎重な作業が必要な場合
|
|||
|
|
```
|
|||
|
|
「SAFE_FIXES_REPORT.md を参照して、
|
|||
|
|
意図的なハードコーディングを誤って変更しないよう注意してください。」
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📈 品質改善ロードマップ
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
現在: 45 issues
|
|||
|
|
↓ Phase 1完了
|
|||
|
|
目標: 38 issues(-7 issues、コメント追加・Phase A修正)
|
|||
|
|
↓ Phase 2完了
|
|||
|
|
目標: 32 issues(-6 issues、Matrix4・ExpansionTileController移行)
|
|||
|
|
↓ Phase 3完了
|
|||
|
|
目標: 25 issues(-7 issues、その他改善)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**作成者**: Claude (Sonnet 4.5)
|
|||
|
|
**作成日時**: 2026年2月4日
|
|||
|
|
**対象バージョン**: v1.0.10+20
|
|||
|
|
**次期バージョン**: v1.0.11+21(推奨)
|
|||
|
|
|
|||
|
|
**Cursor申し送り**: このドキュメントに従って段階的に改善してください。
|
|||
|
|
**優先順位**: フェーズ1 → フェーズ2 → フェーズ3 の順で実施推奨。
|