File tree Expand file tree Collapse file tree 2 files changed +33
-0
lines changed
Expand file tree Collapse file tree 2 files changed +33
-0
lines changed Original file line number Diff line number Diff 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 (() {});
Original file line number Diff line number Diff 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' , () {
You can’t perform that action at this time.
0 commit comments