Skip to content

Commit 59d767e

Browse files
committed
QUICKFIX Parent Destroyed Context Null
*FIX Unable to access context if parent is destroyed.
1 parent c55ab5c commit 59d767e

File tree

2 files changed

+33
-0
lines changed

2 files changed

+33
-0
lines changed

lib/responsive_wrapper.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,6 +443,8 @@ class _ResponsiveWrapperState extends State<ResponsiveWrapper>
443443
// Dimensions are only available after first frame paint.
444444
WidgetsBinding.instance.addObserver(this);
445445
WidgetsBinding.instance.addPostFrameCallback((_) {
446+
// Updating dimensions is safe because frame callbacks
447+
// in initState are guaranteed.
446448
setDimensions();
447449
setState(() {});
448450
});
@@ -461,6 +463,8 @@ class _ResponsiveWrapperState extends State<ResponsiveWrapper>
461463
// The required MediaQueryData is only available
462464
// on the next frame for physical dimension changes.
463465
WidgetsBinding.instance.addPostFrameCallback((_) {
466+
// Widget could be destroyed by resize. Verify widget
467+
// exists before updating dimensions.
464468
if (mounted) {
465469
setDimensions();
466470
setState(() {});

test/responsive_wrapper_test.dart

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,35 @@ void main() {
302302
// Confirm defaults.
303303
expect(find.byWidgetPredicate(widgetPredicate), findsOneWidget);
304304
});
305+
306+
/// Rebuilding ResponsiveWrapper should not
307+
/// throw an error if the parent has been disposed
308+
/// and the context no longer exists. This test verifies
309+
/// that the error is fixed.
310+
testWidgets('Parent Destroyed Context Null', (WidgetTester tester) async {
311+
// 0 width to simulate screen loading.
312+
setScreenSize(tester, Size(1200, 1200));
313+
Widget responsiveWrapper = ResponsiveWrapper.builder(
314+
Container(),
315+
minWidth: 320,
316+
defaultScale: false,
317+
breakpoints: [],
318+
);
319+
Widget widget = MaterialApp(
320+
key: ValueKey('1'),
321+
home: responsiveWrapper,
322+
);
323+
// Pump once to trigger one frame build.
324+
await tester.pumpWidget(widget);
325+
setScreenSize(tester, Size(300, 1200));
326+
// Changing the MaterialApp using a different ValueKey
327+
// disposes the widget and triggers the error (before the fix).
328+
widget = MaterialApp(
329+
key: ValueKey('2'),
330+
home: responsiveWrapper,
331+
);
332+
await tester.pumpWidget(widget);
333+
});
305334
});
306335

307336
group('ResponsiveBreakpoint', () {

0 commit comments

Comments
 (0)