From e05ddcbd9eec6abb9798e0e4ae84f63dc59e9fb8 Mon Sep 17 00:00:00 2001 From: Remi Rousselet Date: Wed, 8 Dec 2021 00:24:04 +0100 Subject: [PATCH] Requiring data preserves the stackTrace (#93592) --- packages/flutter/lib/src/widgets/async.dart | 2 +- packages/flutter/test/widgets/async_test.dart | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/flutter/lib/src/widgets/async.dart b/packages/flutter/lib/src/widgets/async.dart index 5f8ebc46e5..fd2fb79140 100644 --- a/packages/flutter/lib/src/widgets/async.dart +++ b/packages/flutter/lib/src/widgets/async.dart @@ -249,7 +249,7 @@ class AsyncSnapshot { if (hasData) return data!; if (hasError) - throw error!; // ignore: only_throw_errors, since we're just propagating an existing error + Error.throwWithStackTrace(error!, stackTrace!); throw StateError('Snapshot has neither data nor error'); } diff --git a/packages/flutter/test/widgets/async_test.dart b/packages/flutter/test/widgets/async_test.dart index 367a268f5f..d9de5524d6 100644 --- a/packages/flutter/test/widgets/async_test.dart +++ b/packages/flutter/test/widgets/async_test.dart @@ -12,6 +12,20 @@ void main() { return Text(snapshot.toString(), textDirection: TextDirection.ltr); } group('AsyncSnapshot', () { + test('requiring data preserves the stackTrace', () { + final StackTrace originalStackTrace = StackTrace.current; + + try { + AsyncSnapshot.withError( + ConnectionState.done, + Error(), + originalStackTrace, + ).requireData; + fail('requireData did not throw'); + } catch (error, stackTrace) { + expect(stackTrace, originalStackTrace); + } + }); test('requiring data succeeds if data is present', () { expect( const AsyncSnapshot.withData(ConnectionState.done, 'hello').requireData,