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,