From e601e19aabcf0f562756825c4ffd80081f54c9fb Mon Sep 17 00:00:00 2001 From: ramadhan sjamsani Date: Fri, 10 Apr 2026 10:15:01 +0800 Subject: [PATCH] Fix chat page stuck: defer provider state changes past build phase connect() and disconnect() were modifying provider state inside initState/dispose, which Riverpod disallows during widget tree building. Wrapped both in Future.microtask() to defer past the build phase. Applied to both mitra_app and client_app. Co-Authored-By: Claude Opus 4.6 (1M context) --- client_app/lib/features/chat/screens/chat_screen.dart | 7 +++++-- mitra_app/lib/features/chat/screens/mitra_chat_screen.dart | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/client_app/lib/features/chat/screens/chat_screen.dart b/client_app/lib/features/chat/screens/chat_screen.dart index ca24221..f7e6790 100644 --- a/client_app/lib/features/chat/screens/chat_screen.dart +++ b/client_app/lib/features/chat/screens/chat_screen.dart @@ -25,16 +25,19 @@ class _ChatScreenState extends ConsumerState { @override void initState() { super.initState(); - ref.read(chatProvider.notifier).connect(widget.sessionId); + Future.microtask(() { + ref.read(chatProvider.notifier).connect(widget.sessionId); + }); } @override void dispose() { - ref.read(chatProvider.notifier).disconnect(); + final notifier = ref.read(chatProvider.notifier); _messageController.dispose(); _scrollController.dispose(); _typingThrottle?.cancel(); super.dispose(); + Future.microtask(() => notifier.disconnect()); } void _scrollToBottom() { diff --git a/mitra_app/lib/features/chat/screens/mitra_chat_screen.dart b/mitra_app/lib/features/chat/screens/mitra_chat_screen.dart index 6b7f915..793fbcc 100644 --- a/mitra_app/lib/features/chat/screens/mitra_chat_screen.dart +++ b/mitra_app/lib/features/chat/screens/mitra_chat_screen.dart @@ -24,16 +24,19 @@ class _MitraChatScreenState extends ConsumerState { @override void initState() { super.initState(); - ref.read(mitraChatProvider.notifier).connect(widget.sessionId); + Future.microtask(() { + ref.read(mitraChatProvider.notifier).connect(widget.sessionId); + }); } @override void dispose() { - ref.read(mitraChatProvider.notifier).disconnect(); + final notifier = ref.read(mitraChatProvider.notifier); _messageController.dispose(); _scrollController.dispose(); _typingThrottle?.cancel(); super.dispose(); + Future.microtask(() => notifier.disconnect()); } void _scrollToBottom() {