diff --git a/lib/core/services/conversation_delta_listener.dart b/lib/core/services/conversation_delta_listener.dart index caeca69..741d753 100644 --- a/lib/core/services/conversation_delta_listener.dart +++ b/lib/core/services/conversation_delta_listener.dart @@ -69,6 +69,14 @@ class ConversationDeltaListener { ); return; } + if (ref is WidgetRef) { + _subscription = ref.listenManual( + conversationDeltaStreamProvider(_request), + handleNext, + fireImmediately: false, + ); + return; + } if (ref is ProviderContainer) { _subscription = ref.listen( conversationDeltaStreamProvider(_request), @@ -102,6 +110,9 @@ class ConversationDeltaListener { if (ref is Ref) { return ref.mounted; } + // For WidgetRef and ProviderContainer, rely on explicit disposal. + // Callers using WidgetRef must ensure dispose() is called when the + // widget unmounts. return !_disposed; } } diff --git a/lib/features/chat/providers/chat_providers.dart b/lib/features/chat/providers/chat_providers.dart index 380e892..c123b15 100644 --- a/lib/features/chat/providers/chat_providers.dart +++ b/lib/features/chat/providers/chat_providers.dart @@ -1878,12 +1878,16 @@ Future _sendMessageInternal( // Adding a small delay to prevent rapid invalidations that could cause duplicates Future.delayed(const Duration(milliseconds: 100), () { try { - // Guard against using ref after widget disposal - if (ref.mounted == true) { + // Guard against using ref after provider disposal + // Only Ref has .mounted; WidgetRef/ProviderContainer don't support + // this check, so we proceed and let the underlying read operations + // handle any disposal gracefully. + final isMounted = ref is Ref ? ref.mounted : true; + if (isMounted) { refreshConversationsCache(ref); } } catch (_) { - // If ref doesn't support mounted or is disposed, skip + // If ref is disposed or invalid, skip } }); } catch (e) {