From 1a841636541465cff1b41a2ce826df99e79bd398 Mon Sep 17 00:00:00 2001 From: Ponshu Developer Date: Sun, 19 Apr 2026 08:20:42 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20use=5Fbuild=5Fcontext=5Fsynchronously=20?= =?UTF-8?q?=E8=A7=A3=E6=B6=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit _reanalyze で nav / messenger を async gap 前にキャプチャするよう移動。 showDialog の context 引数を ignore 対象行に統合。 dart analyze: No issues found Co-Authored-By: Claude Sonnet 4.6 --- lib/screens/sake_detail_screen.dart | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/lib/screens/sake_detail_screen.dart b/lib/screens/sake_detail_screen.dart index 7928f04..97ee64f 100644 --- a/lib/screens/sake_detail_screen.dart +++ b/lib/screens/sake_detail_screen.dart @@ -301,7 +301,11 @@ class _SakeDetailScreenState extends ConsumerState { Future _reanalyze(BuildContext context) async { // 1. Check Locks if (_isAnalyzing) return; - + + // async gap 前に context 依存オブジェクトをキャプチャ + final nav = Navigator.of(context); + final messenger = ScaffoldMessenger.of(context); + // 2. Check Quota Lockout final quotaLockout = ref.read(quotaLockoutProvider); if (quotaLockout != null) { @@ -309,7 +313,7 @@ class _SakeDetailScreenState extends ConsumerState { if (remaining.isNegative) { ref.read(quotaLockoutProvider.notifier).set(null); } else { - ScaffoldMessenger.of(context).showSnackBar( + messenger.showSnackBar( SnackBar(content: Text('AI利用制限中です。あと${remaining.inSeconds}秒お待ちください。')), ); return; @@ -326,8 +330,6 @@ class _SakeDetailScreenState extends ConsumerState { } } if (!mounted) return; - final nav = Navigator.of(context); - final messenger = ScaffoldMessenger.of(context); if (existingPaths.isEmpty) { messenger.showSnackBar( @@ -339,13 +341,8 @@ class _SakeDetailScreenState extends ConsumerState { setState(() => _isAnalyzing = true); try { - // ignore: use_build_context_synchronously - // mounted チェック済み(334行目)かつ await なしで呼び出すため安全 - showDialog( - context: context, - barrierDismissible: false, - builder: (context) => const AnalyzingDialog(), - ); + // ignore: use_build_context_synchronously + showDialog(context: context, barrierDismissible: false, builder: (context) => const AnalyzingDialog()); final geminiService = ref.read(geminiServiceProvider); final result = await geminiService.analyzeSakeLabel(existingPaths, forceRefresh: true);