diff --git a/.claude/settings.local.json b/.claude/settings.local.json index ac07d5b..07086ad 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -1,7 +1,8 @@ { "permissions": { "allow": [ - "Bash(Get-ChildItem libwidgets -Filter *.dart -Recurse)" + "Bash(dir libsecrets.dart)", + "Bash(flutter analyze:*)" ], "deny": [], "ask": [] diff --git a/lib/main.dart b/lib/main.dart index 6b644a5..d54e6ca 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -8,12 +8,6 @@ import 'models/menu_settings.dart'; import 'providers/theme_provider.dart'; import 'screens/main_screen.dart'; -import 'models/schema/display_data.dart'; -import 'models/schema/hidden_specs.dart'; -import 'models/schema/user_data.dart'; -import 'models/schema/gamification.dart'; -import 'models/schema/metadata.dart'; -import 'models/schema/item_type.dart'; import 'services/migration_service.dart'; void main() async { diff --git a/lib/providers/menu_providers.dart b/lib/providers/menu_providers.dart index 3d7c20b..c19055c 100644 --- a/lib/providers/menu_providers.dart +++ b/lib/providers/menu_providers.dart @@ -1,7 +1,5 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:hive_flutter/hive_flutter.dart'; import 'package:pdf/pdf.dart'; // PdfPageFormat -import '../models/sake_item.dart'; // 1. Menu Mode Toggle final menuModeProvider = NotifierProvider(MenuModeNotifier.new); diff --git a/lib/screens/camera_screen.dart b/lib/screens/camera_screen.dart index 17c73e8..80d58fa 100644 --- a/lib/screens/camera_screen.dart +++ b/lib/screens/camera_screen.dart @@ -1,5 +1,4 @@ import 'dart:async'; // Timer -import 'dart:io'; import 'package:camera/camera.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; @@ -13,7 +12,6 @@ import '../services/gemini_service.dart'; import '../services/ocr_service.dart'; import '../widgets/analyzing_dialog.dart'; import '../models/sake_item.dart'; -import '../providers/sake_list_provider.dart'; import '../theme/app_theme.dart'; import 'package:lucide_icons/lucide_icons.dart'; @@ -166,7 +164,7 @@ class _CameraScreenState extends ConsumerState with SingleTickerPr } } - List _capturedImages = []; + final List _capturedImages = []; Future _takePicture() async { // Check Quota Lockout @@ -294,7 +292,7 @@ class _CameraScreenState extends ConsumerState with SingleTickerPr final extractedText = extractedBuffer.toString().trim(); debugPrint('OCR Extracted Text (${extractedText.length} chars):'); if (extractedText.isNotEmpty) { - debugPrint(extractedText.substring(0, extractedText.length > 100 ? 100 : extractedText.length) + '...'); + debugPrint('${extractedText.substring(0, extractedText.length > 100 ? 100 : extractedText.length)}...'); } // Hybrid Decision Logic (Threshold: 30 chars) diff --git a/lib/screens/home_screen.dart b/lib/screens/home_screen.dart index 16d5b76..746cb83 100644 --- a/lib/screens/home_screen.dart +++ b/lib/screens/home_screen.dart @@ -1,15 +1,12 @@ -import 'package:flutter/cupertino.dart'; // CupertinoPicker +// CupertinoPicker import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../providers/theme_provider.dart'; import '../providers/display_mode_provider.dart'; import 'camera_screen.dart'; -import 'sake_detail_screen.dart'; -import 'menu_pricing_screen.dart'; import 'menu_creation_screen.dart'; import '../theme/app_theme.dart'; -import 'dart:io'; import '../providers/sake_list_provider.dart'; import '../providers/filter_providers.dart'; import '../providers/menu_providers.dart'; // Phase 2-1 @@ -20,12 +17,10 @@ import 'package:flutter/services.dart'; // Haptic import '../services/gemini_service.dart'; import '../services/image_compression_service.dart'; import '../widgets/analyzing_dialog.dart'; -import '../widgets/quota_warning_dialog.dart'; import 'package:hive_flutter/hive_flutter.dart'; import 'package:uuid/uuid.dart'; import 'package:path_provider/path_provider.dart'; import 'package:path/path.dart' show join; -import 'package:reorderable_grid_view/reorderable_grid_view.dart'; import '../widgets/sake_search_delegate.dart'; import '../widgets/onboarding_dialog.dart'; import '../widgets/home/sake_filter_chips.dart'; diff --git a/lib/screens/menu_creation_screen.dart b/lib/screens/menu_creation_screen.dart index 5c353d2..21d3d70 100644 --- a/lib/screens/menu_creation_screen.dart +++ b/lib/screens/menu_creation_screen.dart @@ -1,7 +1,5 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/services.dart'; import '../providers/sake_list_provider.dart'; import '../providers/menu_providers.dart'; import '../providers/display_mode_provider.dart'; diff --git a/lib/screens/menu_pricing_screen.dart b/lib/screens/menu_pricing_screen.dart index 68c8d4e..26a46f2 100644 --- a/lib/screens/menu_pricing_screen.dart +++ b/lib/screens/menu_pricing_screen.dart @@ -360,7 +360,7 @@ class _MenuPricingScreenState extends ConsumerState { style: TextStyle(fontSize: 14, color: Colors.grey), ), Text( - '${PricingHelper.formatPrice(currentPrice!)}円', + '${PricingHelper.formatPrice(currentPrice)}円', style: const TextStyle( fontSize: 16, fontWeight: FontWeight.bold, diff --git a/lib/screens/menu_settings_screen.dart b/lib/screens/menu_settings_screen.dart index 3fa3391..638b132 100644 --- a/lib/screens/menu_settings_screen.dart +++ b/lib/screens/menu_settings_screen.dart @@ -5,12 +5,10 @@ import 'package:flutter/cupertino.dart'; // For Rolling Picker import 'pdf_preview_screen.dart'; import 'package:hive_flutter/hive_flutter.dart'; import '../providers/menu_providers.dart'; -import '../services/pdf_service.dart'; import '../models/sake_item.dart'; import '../models/menu_settings.dart'; import '../providers/sake_list_provider.dart'; import '../widgets/step_indicator.dart'; -import 'package:printing/printing.dart'; import '../theme/app_theme.dart'; class MenuSettingsScreen extends ConsumerStatefulWidget { @@ -196,7 +194,7 @@ class _MenuSettingsScreenState extends ConsumerState { title: Text(sake.displayData.name), subtitle: Text('${sake.displayData.brewery} / ${sake.displayData.prefecture}'), dense: true, - )).toList(), + )), const Divider(height: 32), @@ -332,7 +330,7 @@ class _MenuSettingsScreenState extends ConsumerState { Text('縦向き', style: TextStyle(fontWeight: FontWeight.bold)), Switch( value: ref.watch(pdfIsPortraitProvider), - activeColor: AppTheme.posimaiBlue, + activeThumbColor: AppTheme.posimaiBlue, onChanged: (val) => ref.read(pdfIsPortraitProvider.notifier).set(val), ), ], @@ -386,7 +384,7 @@ class _MenuSettingsScreenState extends ConsumerState { const Text('カラー', style: TextStyle(fontWeight: FontWeight.bold)), Switch( value: !isMonochrome, // ON = Color (!Monochrome) - activeColor: AppTheme.posimaiBlue, + activeThumbColor: AppTheme.posimaiBlue, onChanged: (val) => setState(() { isMonochrome = !val; // Toggle logic ref.read(pdfIsMonochromeProvider.notifier).set(isMonochrome); diff --git a/lib/screens/placeholders/brewery_map_screen.dart b/lib/screens/placeholders/brewery_map_screen.dart index 20d72c5..6b3e9d9 100644 --- a/lib/screens/placeholders/brewery_map_screen.dart +++ b/lib/screens/placeholders/brewery_map_screen.dart @@ -32,9 +32,9 @@ class _BreweryMapScreenState extends ConsumerState { // Extract visited prefectures final visitedPrefectures = sakeList .map((s) => s.displayData.prefecture) - .where((p) => p != null && p.isNotEmpty) + .where((p) => p.isNotEmpty) .where((p) => p != '不明' && p != '海外') - .map((p) => p!) + .map((p) => p) .toSet(); final totalPrefs = 47; diff --git a/lib/screens/placeholders/placeholders.dart b/lib/screens/placeholders/placeholders.dart index 5de3186..42bb328 100644 --- a/lib/screens/placeholders/placeholders.dart +++ b/lib/screens/placeholders/placeholders.dart @@ -1,6 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import '../../providers/theme_provider.dart'; export 'brewery_map_screen.dart'; export 'sommelier_screen.dart'; diff --git a/lib/screens/placeholders/sommelier_screen.dart b/lib/screens/placeholders/sommelier_screen.dart index 1c7159b..b389624 100644 --- a/lib/screens/placeholders/sommelier_screen.dart +++ b/lib/screens/placeholders/sommelier_screen.dart @@ -1,5 +1,4 @@ import 'dart:io'; -import 'dart:typed_data'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:lucide_icons/lucide_icons.dart'; diff --git a/lib/screens/sake_detail_screen.dart b/lib/screens/sake_detail_screen.dart index 27f7158..92eabc8 100644 --- a/lib/screens/sake_detail_screen.dart +++ b/lib/screens/sake_detail_screen.dart @@ -800,7 +800,7 @@ class _SakeDetailScreenState extends ConsumerState { const SizedBox(height: 4), Text( calculatedPrice > 0 - ? '現在${calculatedPrice}円' + ? '現在$calculatedPrice円' : '未設定', style: TextStyle( fontSize: 18, @@ -998,7 +998,7 @@ class _SakeDetailScreenState extends ConsumerState { ), if (e.key != variants.keys.last) const Divider(height: 1), ], - )).toList(), + )), ], ), ), diff --git a/lib/screens/scan_screen.dart b/lib/screens/scan_screen.dart index 8f3176f..23c3501 100644 --- a/lib/screens/scan_screen.dart +++ b/lib/screens/scan_screen.dart @@ -2,7 +2,6 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:mobile_scanner/mobile_scanner.dart'; import '../theme/app_theme.dart'; -import '../models/schema/sake_taste_stats.dart'; import '../widgets/sake_radar_chart.dart'; class ScanARScreen extends StatefulWidget { diff --git a/lib/screens/soul_screen.dart b/lib/screens/soul_screen.dart index f83a741..70a3620 100644 --- a/lib/screens/soul_screen.dart +++ b/lib/screens/soul_screen.dart @@ -2,7 +2,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:lucide_icons/lucide_icons.dart'; import 'package:intl/intl.dart'; -import 'package:package_info_plus/package_info_plus.dart'; import '../providers/theme_provider.dart'; import '../widgets/settings/app_settings_section.dart'; import '../widgets/settings/other_settings_section.dart'; diff --git a/lib/services/backup_service.dart b/lib/services/backup_service.dart index a56c38d..3934cb6 100644 --- a/lib/services/backup_service.dart +++ b/lib/services/backup_service.dart @@ -277,11 +277,9 @@ class BackupService { try { final check = await driveApi.files.get(uploadedFile.id!); // getが成功すればファイルは存在する - if (check != null) { - verified = true; - print('✅ アップロード検証成功: ファイル存在確認済み'); - } - } catch (e) { + verified = true; + print('✅ アップロード検証成功: ファイル存在確認済み'); + } catch (e) { print('⚠️ 検証試行 ${retryCount + 1} 失敗: $e'); } retryCount++; diff --git a/lib/services/image_compression_service.dart b/lib/services/image_compression_service.dart index 41c9fab..946927a 100644 --- a/lib/services/image_compression_service.dart +++ b/lib/services/image_compression_service.dart @@ -36,7 +36,7 @@ class ImageCompressionService { // リサイズが不要な場合はそのまま返す if (originalWidth <= maxDimension && originalHeight <= maxDimension) { - debugPrint('Image already optimized: ${originalWidth}x${originalHeight}'); + debugPrint('Image already optimized: ${originalWidth}x$originalHeight'); return sourcePath; } @@ -51,7 +51,7 @@ class ImageCompressionService { final int newWidth = (originalWidth * scale).round(); final int newHeight = (originalHeight * scale).round(); - debugPrint('Compressing image: ${originalWidth}x${originalHeight} -> ${newWidth}x${newHeight}'); + debugPrint('Compressing image: ${originalWidth}x$originalHeight -> ${newWidth}x$newHeight'); // Flutter標準の画像処理では詳細なリサイズができないため、 // 代わりにファイルサイズ削減のみ実施 diff --git a/lib/services/pdf_service.dart b/lib/services/pdf_service.dart index 2ae0a28..3ccac53 100644 --- a/lib/services/pdf_service.dart +++ b/lib/services/pdf_service.dart @@ -1,5 +1,4 @@ import 'dart:io'; -import 'dart:typed_data'; import 'package:flutter/foundation.dart'; import 'package:pdf/pdf.dart'; import 'package:pdf/widgets.dart' as pw; diff --git a/lib/services/shuko_diagnosis_service.dart b/lib/services/shuko_diagnosis_service.dart index c01b9da..a1d2123 100644 --- a/lib/services/shuko_diagnosis_service.dart +++ b/lib/services/shuko_diagnosis_service.dart @@ -20,15 +20,13 @@ class ShukoDiagnosisService { for (var item in items) { final stats = item.hiddenSpecs.sakeTasteStats; - if (stats != null) { - totalAroma += stats.aroma; - totalRichness += stats.richness; - totalSweetness += stats.sweetness; - totalAlcohol += stats.alcoholFeeling; - totalFruity += stats.fruitiness; - count++; - } - } + totalAroma += stats.aroma; + totalRichness += stats.richness; + totalSweetness += stats.sweetness; + totalAlcohol += stats.alcoholFeeling; + totalFruity += stats.fruitiness; + count++; + } if (count == 0) { return ShukoProfile.empty(); diff --git a/lib/widgets/add_set_item_dialog.dart b/lib/widgets/add_set_item_dialog.dart index 66f01db..971b874 100644 --- a/lib/widgets/add_set_item_dialog.dart +++ b/lib/widgets/add_set_item_dialog.dart @@ -7,7 +7,6 @@ import 'package:uuid/uuid.dart'; import 'package:path_provider/path_provider.dart'; import 'package:path/path.dart' as path; import '../models/sake_item.dart'; -import '../providers/sake_list_provider.dart'; import '../theme/app_theme.dart'; import 'package:lucide_icons/lucide_icons.dart'; diff --git a/lib/widgets/home/sake_filter_chips.dart b/lib/widgets/home/sake_filter_chips.dart index 35693a7..617a909 100644 --- a/lib/widgets/home/sake_filter_chips.dart +++ b/lib/widgets/home/sake_filter_chips.dart @@ -2,7 +2,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../../providers/sake_list_provider.dart'; import '../../providers/filter_providers.dart'; -import '../../models/sake_item.dart'; import '../../theme/app_theme.dart'; import 'package:lucide_icons/lucide_icons.dart'; diff --git a/lib/widgets/home/sake_list_item.dart b/lib/widgets/home/sake_list_item.dart index 48faedb..94309fa 100644 --- a/lib/widgets/home/sake_list_item.dart +++ b/lib/widgets/home/sake_list_item.dart @@ -6,7 +6,7 @@ import '../../providers/menu_providers.dart'; import '../../screens/sake_detail_screen.dart'; import '../../theme/app_theme.dart'; import 'package:lucide_icons/lucide_icons.dart'; -import 'package:flutter/services.dart'; // Haptic via InkWell? No, explicit HapticFeedback used generally. +// Haptic via InkWell? No, explicit HapticFeedback used generally. class SakeListItem extends ConsumerWidget { final SakeItem sake; diff --git a/lib/widgets/prefecture_filter_sheet.dart b/lib/widgets/prefecture_filter_sheet.dart index 97b6767..04476cc 100644 --- a/lib/widgets/prefecture_filter_sheet.dart +++ b/lib/widgets/prefecture_filter_sheet.dart @@ -2,7 +2,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import '../theme/app_theme.dart'; import '../providers/sake_list_provider.dart'; import '../providers/filter_providers.dart'; diff --git a/lib/widgets/settings/other_settings_section.dart b/lib/widgets/settings/other_settings_section.dart index 56a797d..600ac78 100644 --- a/lib/widgets/settings/other_settings_section.dart +++ b/lib/widgets/settings/other_settings_section.dart @@ -55,7 +55,7 @@ class _OtherSettingsSectionState extends ConsumerState { trailing: Switch( value: userProfile.isBusinessMode, onChanged: (val) => ref.read(userProfileProvider.notifier).toggleBusinessMode(), - activeColor: Colors.orange, + activeThumbColor: Colors.orange, ), ), const Divider(height: 1), diff --git a/tool/check_models.dart b/tool/check_models.dart index 80a04f8..b68cc61 100644 --- a/tool/check_models.dart +++ b/tool/check_models.dart @@ -1,6 +1,6 @@ import 'dart:io'; import 'dart:convert'; -import '../lib/secrets.dart'; +import 'package:ponshu_room_lite/secrets.dart'; void main() async { print('Checking available Gemini models via API...');