diff --git a/packages/flutter_riverpod/pubspec.yaml b/packages/flutter_riverpod/pubspec.yaml index 9f0c83a21..7927a39e5 100644 --- a/packages/flutter_riverpod/pubspec.yaml +++ b/packages/flutter_riverpod/pubspec.yaml @@ -25,3 +25,4 @@ dev_dependencies: flutter_test: sdk: flutter mockito: ^5.0.0 + stack_trace: ^1.11.1 diff --git a/packages/flutter_riverpod/test/throw_with_stacktrace_test.dart b/packages/flutter_riverpod/test/throw_with_stacktrace_test.dart new file mode 100644 index 000000000..94faf31e3 --- /dev/null +++ b/packages/flutter_riverpod/test/throw_with_stacktrace_test.dart @@ -0,0 +1,30 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/src/internals.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:stack_trace/stack_trace.dart'; + +void main() { + testWidgets('Flutter does not ask to demangle stacktraces', (tester) async { + final previousErrorHandler = FlutterError.onError; + final stacks = []; + + FlutterError.onError = (details) => stacks.add(details.stack); + await tester.pumpWidget( + MaterialApp( + home: Consumer( + // ignore: invalid_use_of_internal_member + builder: (context, ref, child) => throwErrorWithCombinedStackTrace( + StateError('Hello world'), + StackTrace.current, + ), + ), + ), + ); + FlutterError.onError = previousErrorHandler; + + expect( + stacks, + everyElement(isNot(anyOf(isA(), isA()))), + ); + }); +} diff --git a/packages/riverpod/CHANGELOG.md b/packages/riverpod/CHANGELOG.md index 529dc3f57..363e09da8 100644 --- a/packages/riverpod/CHANGELOG.md +++ b/packages/riverpod/CHANGELOG.md @@ -1,3 +1,7 @@ +## Unreleased patch + +- Fix some exceptions causing Flutter asking to demangle stacktraces (#1874) + ## 2.3.7 - 2023-08-16 - Added support for state_notifier 1.0.0 diff --git a/packages/riverpod/lib/src/internals.dart b/packages/riverpod/lib/src/internals.dart index f2e34fa88..425a30feb 100644 --- a/packages/riverpod/lib/src/internals.dart +++ b/packages/riverpod/lib/src/internals.dart @@ -15,6 +15,7 @@ export 'notifier.dart'; export 'provider.dart'; export 'result.dart'; export 'run_guarded.dart'; +export 'stack_trace.dart'; export 'state_notifier_provider.dart'; export 'state_provider.dart'; export 'stream_provider.dart'; diff --git a/packages/riverpod/lib/src/stack_trace.dart b/packages/riverpod/lib/src/stack_trace.dart index 71db9b06c..065f08f5d 100644 --- a/packages/riverpod/lib/src/stack_trace.dart +++ b/packages/riverpod/lib/src/stack_trace.dart @@ -10,5 +10,5 @@ Never throwErrorWithCombinedStackTrace(Object error, StackTrace stackTrace) { ...Chain.forTrace(stackTrace).traces, ]).foldFrames((frame) => frame.package == 'riverpod'); - Error.throwWithStackTrace(error, chain); + Error.throwWithStackTrace(error, chain.toTrace().vmTrace); }