From 0f57a734137c6c677867ed9f7a3a30f9819aa3d7 Mon Sep 17 00:00:00 2001 From: Chamber Date: Fri, 17 Jul 2026 15:38:44 +0800 Subject: [PATCH 1/2] fix(ui): pass the correct BuildContext to `onReactionPicked` (#1234) * fix(ui): pass the correct BuildContext to `onReactionPicked` Pass the appropriate `BuildContext` to the `onReactionPicked` callback so navigation uses the correct context. * Update tests and usages to match the new signature. --- .../message_modal/message_actions_modal.dart | 2 +- .../message_widget/stream_message_item.dart | 2 +- .../src/reactions/picker/reaction_picker.dart | 11 +++----- .../picker/reaction_picker_test.dart | 26 +++++++++---------- 4 files changed, 18 insertions(+), 23 deletions(-) diff --git a/packages/stream_chat_flutter/lib/src/message_modal/message_actions_modal.dart b/packages/stream_chat_flutter/lib/src/message_modal/message_actions_modal.dart index 771c5adf12..5b2c960ea3 100644 --- a/packages/stream_chat_flutter/lib/src/message_modal/message_actions_modal.dart +++ b/packages/stream_chat_flutter/lib/src/message_modal/message_actions_modal.dart @@ -65,7 +65,7 @@ class StreamMessageActionsModal extends StatelessWidget { final spacing = context.streamSpacing; final effectiveAlignment = alignment ?? StreamMessageLayout.alignmentDirectionalOf(context); - void onReactionPicked(Reaction reaction) { + void onReactionPicked(Reaction reaction, BuildContext context) { final action = SelectReaction(message: message, reaction: reaction); return Navigator.pop(context, action); } diff --git a/packages/stream_chat_flutter/lib/src/message_widget/stream_message_item.dart b/packages/stream_chat_flutter/lib/src/message_widget/stream_message_item.dart index 5a7c9132da..c941f084c3 100644 --- a/packages/stream_chat_flutter/lib/src/message_widget/stream_message_item.dart +++ b/packages/stream_chat_flutter/lib/src/message_widget/stream_message_item.dart @@ -678,7 +678,7 @@ class DefaultStreamMessageItem extends StatelessWidget { currentUser: currentUser, ); - void onReactionPicked(Reaction reaction) { + void onReactionPicked(Reaction reaction, BuildContext context) { final action = SelectReaction(message: message, reaction: reaction); return Navigator.pop(context, action); // Pop the modal with the selected reaction action } diff --git a/packages/stream_chat_flutter/lib/src/reactions/picker/reaction_picker.dart b/packages/stream_chat_flutter/lib/src/reactions/picker/reaction_picker.dart index b53eef970e..fea5a73ade 100644 --- a/packages/stream_chat_flutter/lib/src/reactions/picker/reaction_picker.dart +++ b/packages/stream_chat_flutter/lib/src/reactions/picker/reaction_picker.dart @@ -3,11 +3,6 @@ import 'package:stream_chat_flutter/src/stream_chat_configuration.dart'; import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart'; import 'package:stream_core_flutter/chat.dart'; -/// {@template onReactionPicked} -/// Callback called when a reaction is picked. -/// {@endtemplate} -typedef OnReactionPicked = ValueSetter; - /// {@template streamMessageReactionPicker} /// A chat-specific reaction picker that bridges [StreamReactionPicker] with /// chat domain models. @@ -37,7 +32,7 @@ class StreamMessageReactionPicker extends StatelessWidget { final Message message; /// {@macro onReactionPicked} - final OnReactionPicked? onReactionPicked; + final Function(Reaction, BuildContext)? onReactionPicked; @override Widget build(BuildContext context) { @@ -66,7 +61,7 @@ class StreamMessageReactionPicker extends StatelessWidget { _ => Reaction(type: item.key, emojiCode: reactionEmojiCode), }; - return onReactionPicked?.call(pickedReaction); + return onReactionPicked?.call(pickedReaction, context); } return StreamReactionPicker( @@ -84,7 +79,7 @@ class StreamMessageReactionPicker extends StatelessWidget { if (!context.mounted || emoji == null) return; final reaction = Reaction(type: emoji.shortName, emojiCode: emoji.emoji); - return onReactionPicked?.call(reaction); + return onReactionPicked?.call(reaction, context); }, ); } diff --git a/packages/stream_chat_flutter/test/src/reactions/picker/reaction_picker_test.dart b/packages/stream_chat_flutter/test/src/reactions/picker/reaction_picker_test.dart index dfc1f7c01d..4b005c1c32 100644 --- a/packages/stream_chat_flutter/test/src/reactions/picker/reaction_picker_test.dart +++ b/packages/stream_chat_flutter/test/src/reactions/picker/reaction_picker_test.dart @@ -20,7 +20,7 @@ void main() { _wrapWithMaterialApp( StreamMessageReactionPicker( message: message, - onReactionPicked: (_) {}, + onReactionPicked: (_, _) {}, ), reactionIconResolver: resolver, ), @@ -54,7 +54,7 @@ void main() { _wrapWithMaterialApp( StreamMessageReactionPicker( message: message, - onReactionPicked: (reaction) { + onReactionPicked: (reaction, _) { pickedReaction = reaction; }, ), @@ -98,7 +98,7 @@ void main() { _wrapWithMaterialApp( StreamMessageReactionPicker( message: message, - onReactionPicked: (reaction) { + onReactionPicked: (reaction, _) { pickedReaction = reaction; }, ), @@ -136,7 +136,7 @@ void main() { _wrapWithMaterialApp( StreamMessageReactionPicker( message: message, - onReactionPicked: (_) {}, + onReactionPicked: (_, _) {}, ), reactionIconResolver: resolver, ), @@ -172,7 +172,7 @@ void main() { _wrapWithMaterialApp( StreamMessageReactionPicker( message: message, - onReactionPicked: (_) {}, + onReactionPicked: (_, _) {}, ), reactionIconResolver: compactResolver, ), @@ -186,7 +186,7 @@ void main() { _wrapWithMaterialApp( StreamMessageReactionPicker( message: message, - onReactionPicked: (_) {}, + onReactionPicked: (_, _) {}, ), reactionIconResolver: resolver, ), @@ -216,7 +216,7 @@ void main() { _wrapWithMaterialApp( StreamMessageReactionPicker( message: message, - onReactionPicked: (_) {}, + onReactionPicked: (_, _) {}, ), reactionIconResolver: subsetResolver, ), @@ -251,7 +251,7 @@ void main() { _wrapWithMaterialApp( StreamMessageReactionPicker( message: message, - onReactionPicked: (_) {}, + onReactionPicked: (_, _) {}, ), reactionIconResolver: subsetResolver, ), @@ -290,7 +290,7 @@ void main() { _wrapWithMaterialApp( StreamMessageReactionPicker( message: message, - onReactionPicked: (_) {}, + onReactionPicked: (_, _) {}, ), reactionIconResolver: const _TypeBasedReactionIconResolver(), ), @@ -320,7 +320,7 @@ void main() { _wrapWithMaterialApp( StreamMessageReactionPicker( message: message, - onReactionPicked: (_) {}, + onReactionPicked: (_, _) {}, ), reactionIconResolver: resolver, ), @@ -350,7 +350,7 @@ void main() { return _wrapWithMaterialApp( StreamMessageReactionPicker( message: message, - onReactionPicked: (_) {}, + onReactionPicked: (_, _) {}, ), reactionIconResolver: resolver, brightness: brightness, @@ -379,7 +379,7 @@ void main() { return _wrapWithMaterialApp( StreamMessageReactionPicker( message: message, - onReactionPicked: (_) {}, + onReactionPicked: (_, _) {}, ), reactionIconResolver: resolver, brightness: brightness, @@ -401,7 +401,7 @@ void main() { return _wrapWithMaterialApp( StreamMessageReactionPicker( message: message, - onReactionPicked: (_) {}, + onReactionPicked: (_, _) {}, ), reactionIconResolver: const _SubsetDefaultReactionIconResolver(), brightness: brightness, From 15a387a1cf3be21ab575122813ea3ef5f65309f9 Mon Sep 17 00:00:00 2001 From: Chamber Date: Fri, 17 Jul 2026 15:53:23 +0800 Subject: [PATCH 2/2] Update CHANGELOG.md --- packages/stream_chat_flutter/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/stream_chat_flutter/CHANGELOG.md b/packages/stream_chat_flutter/CHANGELOG.md index dd65f0b533..f7e8c4e4b0 100644 --- a/packages/stream_chat_flutter/CHANGELOG.md +++ b/packages/stream_chat_flutter/CHANGELOG.md @@ -11,6 +11,7 @@ - Fixed shadowed messages not hidden in channel list items. - Fixed `StreamMessageListView` firing `markThreadRead` on a reply-less parent, which produced a guaranteed 404 every time the thread view was opened before the first reply. - Fixed dismissing the `StreamMessageListView` unread indicator being ignored while a channel is receiving a rapid burst of messages. +- Fixed `onReactionPicked` using an incorrect `BuildContext`, which could cause the parent route to be popped unexpectedly when used with nested navigators. ## 10.1.0