Skip to content

Commit 0e775e1

Browse files
cursoragentclaude
andcommitted
fix: guard feedback success callback
Catch exceptions from onSubmitSuccess so the success snackbar and dismissal still run after successful submission. Add a widget test that reproduces a throwing callback and asserts the feedback view still closes and shows success. Co-Authored-By: Claude <[email protected]>
1 parent 53d8c76 commit 0e775e1

2 files changed

Lines changed: 35 additions & 1 deletion

File tree

packages/flutter/lib/src/feedback/sentry_feedback_widget.dart

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'sentry_feedback_options.dart';
88
import 'package:flutter/services.dart';
99
import 'sentry_logo.dart';
1010
import '../replay/integration.dart';
11+
import '../utils/internal_logger.dart';
1112

1213
class SentryFeedbackWidget extends StatefulWidget {
1314
SentryFeedbackWidget({
@@ -388,7 +389,15 @@ class _SentryFeedbackWidgetState extends State<SentryFeedbackWidget> {
388389

389390
if (!mounted) return;
390391

391-
widget.options.onSubmitSuccess?.call(feedback, sentryId);
392+
try {
393+
widget.options.onSubmitSuccess?.call(feedback, sentryId);
394+
} catch (exception, stackTrace) {
395+
internalLogger.error(
396+
'SentryFeedbackWidget failed to execute onSubmitSuccess callback',
397+
error: exception,
398+
stackTrace: stackTrace,
399+
);
400+
}
392401
_showSuccessSnackBar();
393402
_dismiss(pendingAssociatedEventId: false);
394403
}

packages/flutter/test/feedback/sentry_feedback_widget_test.dart

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -889,6 +889,31 @@ void main() {
889889
expect(receivedEventId, isNotNull);
890890
expect(receivedEventId, isNot(const SentryId.empty()));
891891
});
892+
893+
testWidgets('dismisses and shows snackbar when onSubmitSuccess throws',
894+
(tester) async {
895+
fixture.options.feedback.onSubmitSuccess = (feedback, eventId) {
896+
throw Exception('onSubmitSuccess failed');
897+
};
898+
899+
await fixture.pumpFeedbackHost(tester);
900+
901+
await tester.tap(find.text('Show Feedback'));
902+
await tester.pumpAndSettle();
903+
904+
await tester.enterText(
905+
find.byKey(const ValueKey('sentry_feedback_message_textfield')),
906+
'callback-throw-test',
907+
);
908+
await tester.tap(find.text('Send Bug Report'));
909+
await tester.pumpAndSettle();
910+
911+
expect(tester.takeException(), isNull);
912+
expect(find.byType(SentryFeedbackWidget), findsNothing);
913+
expect(find.byType(SnackBar), findsOneWidget);
914+
expect(find.text('Thank you for your report!'), findsOneWidget);
915+
expect(SentryFeedbackWidget.pendingAssociatedEventId, isNull);
916+
});
892917
});
893918
});
894919
}

0 commit comments

Comments
 (0)