Sitelet https://github.com/flutter/flutter/issues/13484
Skip to content

InheritedWidget depending on the result of "MediaQuery.of(context)" does not work after navigation #13484

Description

@hundeva

So I have a custom InheritedWidget that is depending on the result of MediaQuery.of(context) (basically, for dynamic dimensions depending on device width/height, would be very useful for rotation), which works perfectly, up until I navigate to a different route, after that, the of(context) mechanism returns null. Please see the example code below, tap on "Tap to navigate" button, that would replace the currently visible ConsumerWidget with a new instance of ConsumerWidget, and observe the crash.

I don't really understand why this is happening, if I had to guess, an InheritedWidget depending on another InheritedWidget doesn't seem to keep working after a navigation event. Am I doing something wrong? Is there an alternate way?

Steps to Reproduce

import 'package:flutter/material.dart';

void main() {
  runApp(new TestApp());
}

class TestApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new Builder(
        builder: (context) {
          return new MyInheritedWidget(
            data: MediaQuery.of(context),
            child: new ConsumerWidget(),
          );
        },
      ),
    );
  }
}

class MyInheritedWidget extends InheritedWidget {

  static MyInheritedWidget of(BuildContext context) =>
      context.inheritFromWidgetOfExactType(MyInheritedWidget);

  final MediaQueryData _data;

  MyInheritedWidget({
    Key key,
    MediaQueryData data,
    Widget child,
  })
      :
        _data = data,
        super(key: key, child: child);

  @override
  bool updateShouldNotify(MyInheritedWidget oldWidget) =>
      _data != oldWidget._data;

  String get deviceWidth => _data.size.width.toString();
}

class ConsumerWidget extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text('Device width is ${MyInheritedWidget
            .of(context)
            .deviceWidth}'),
      ),

      body: new Center(
        child: new FlatButton(
          child: new Text('Tap to navigate'),
          onPressed: () => _navigate(context),
        ),
      ),
    );
  }

  void _navigate(BuildContext context) {
    Navigator.of(context)
      ..pop()
      ..push(
        new MaterialPageRoute(
          builder: (_) => new ConsumerWidget(),
        ),
      );
  }
}

Screenshot right after tapping on navigation button in example code.
The exception log:

Logs

I/flutter ( 5389): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter ( 5389): The following NoSuchMethodError was thrown building ConsumerWidget(dirty):
I/flutter ( 5389): The getter 'deviceWidth' was called on null.
I/flutter ( 5389): Receiver: null
I/flutter ( 5389): Tried calling: deviceWidth
I/flutter ( 5389): 
I/flutter ( 5389): When the exception was thrown, this was the stack:
I/flutter ( 5389): #0      Object.noSuchMethod (dart:core-patch/dart:core/object_patch.dart:46)
I/flutter ( 5389): #1      ConsumerWidget.build (file:///C:/Git/commuter/lib/main.dart:54)
I/flutter ( 5389): #2      StatelessElement.build (package:flutter/src/widgets/framework.dart:3599)
I/flutter ( 5389): #3      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3544)
I/flutter ( 5389): #4      Element.rebuild (package:flutter/src/widgets/framework.dart:3445)
I/flutter ( 5389): #5      ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3524)
I/flutter ( 5389): #6      ComponentElement.mount (package:flutter/src/widgets/framework.dart:3519)
I/flutter ( 5389): #7      Element.inflateWidget (package:flutter/src/widgets/framework.dart:2857)
I/flutter ( 5389): #8      Element.updateChild (package:flutter/src/widgets/framework.dart:2660)
I/flutter ( 5389): #9      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3556)
I/flutter ( 5389): #10     Element.rebuild (package:flutter/src/widgets/framework.dart:3445)
I/flutter ( 5389): #11     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3524)
I/flutter ( 5389): #12     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3519)
I/flutter ( 5389): #13     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2857)
I/flutter ( 5389): #14     Element.updateChild (package:flutter/src/widgets/framework.dart:2660)
I/flutter ( 5389): #15     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3556)
I/flutter ( 5389): #16     Element.rebuild (package:flutter/src/widgets/framework.dart:3445)
I/flutter ( 5389): #17     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3524)
I/flutter ( 5389): #18     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3519)
I/flutter ( 5389): #19     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2857)
I/flutter ( 5389): #20     Element.updateChild (package:flutter/src/widgets/framework.dart:2660)
I/flutter ( 5389): #21     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4532)
I/flutter ( 5389): #22     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2857)
I/flutter ( 5389): #23     Element.updateChild (package:flutter/src/widgets/framework.dart:2660)
I/flutter ( 5389): #24     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4532)
I/flutter ( 5389): #25     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2857)
I/flutter ( 5389): #26     Element.updateChild (package:flutter/src/widgets/framework.dart:2660)
I/flutter ( 5389): #27     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3556)
I/flutter ( 5389): #28     Element.rebuild (package:flutter/src/widgets/framework.dart:3445)
I/flutter ( 5389): #29     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3524)
I/flutter ( 5389): #30     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3662)
I/flutter ( 5389): #31     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3519)
I/flutter ( 5389): #32     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2857)
I/flutter ( 5389): #33     Element.updateChild (package:flutter/src/widgets/framework.dart:2660)
I/flutter ( 5389): #34     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3556)
I/flutter ( 5389): #35     Element.rebuild (package:flutter/src/widgets/framework.dart:3445)
I/flutter ( 5389): #36     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3524)
I/flutter ( 5389): #37     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3519)
I/flutter ( 5389): #38     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2857)
I/flutter ( 5389): #39     Element.updateChild (package:flutter/src/widgets/framework.dart:2660)
I/flutter ( 5389): #40     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4532)
I/flutter ( 5389): #41     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2857)
I/flutter ( 5389): #42     Element.updateChild (package:flutter/src/widgets/framework.dart:2660)
I/flutter ( 5389): #43     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4532)
I/flutter ( 5389): #44     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2857)
I/flutter ( 5389): #45     Element.updateChild (package:flutter/src/widgets/framework.dart:2660)
I/flutter ( 5389): #46     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3556)
I/flutter ( 5389): #47     Element.rebuild (package:flutter/src/widgets/framework.dart:3445)
I/flutter ( 5389): #48     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3524)
I/flutter ( 5389): #49     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3519)
I/flutter ( 5389): #50     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2857)
I/flutter ( 5389): #51     Element.updateChild (package:flutter/src/widgets/framework.dart:2660)
I/flutter ( 5389): #52     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4532)
I/flutter ( 5389): #53     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2857)
I/flutter ( 5389): #54     Element.updateChild (package:flutter/src/widgets/framework.dart:2660)
I/flutter ( 5389): #55     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3556)
I/flutter ( 5389): #56     Element.rebuild (package:flutter/src/widgets/framework.dart:3445)
I/flutter ( 5389): #57     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3524)
I/flutter ( 5389): #58     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3662)
I/flutter ( 5389): #59     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3519)
I/flutter ( 5389): #60     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2857)
I/flutter ( 5389): #61     Element.updateChild (package:flutter/src/widgets/framework.dart:2660)
I/flutter ( 5389): #62     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3556)
I/flutter ( 5389): #63     Element.rebuild (package:flutter/src/widgets/framework.dart:3445)
I/flutter ( 5389): #64     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3524)
I/flutter ( 5389): #65     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3662)
I/flutter ( 5389): #66     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3519)
I/flutter ( 5389): #67     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2857)
I/flutter ( 5389): #68     Element.updateChild (package:flutter/src/widgets/framework.dart:2660)
I/flutter ( 5389): #69     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3556)
I/flutter ( 5389): #70     Element.rebuild (package:flutter/src/widgets/framework.dart:3445)
I/flutter ( 5389): #71     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3524)
I/flutter ( 5389): #72     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3662)
I/flutter ( 5389): #73     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3519)
I/flutter ( 5389): #74     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2857)
I/flutter ( 5389): #75     Element.updateChild (package:flutter/src/widgets/framework.dart:2660)
I/flutter ( 5389): #76     RenderObjectElement.updateChildren (package:flutter/src/widgets/framework.dart:4319)
I/flutter ( 5389): #77     MultiChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4647)
I/flutter ( 5389): #78     Element.updateChild (package:flutter/src/widgets/framework.dart:2649)
I/flutter ( 5389): #79     _TheatreElement.update (package:flutter/src/widgets/overlay.dart:507)
I/flutter ( 5389): #80     Element.updateChild (package:flutter/src/widgets/framework.dart:2649)
I/flutter ( 5389): #81     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3556)
I/flutter ( 5389): #82     Element.rebuild (package:flutter/src/widgets/framework.dart:3445)
I/flutter ( 5389): #83     StatefulElement.update (package:flutter/src/widgets/framework.dart:3681)
I/flutter ( 5389): #84     Element.updateChild (package:flutter/src/widgets/framework.dart:2649)
I/flutter ( 5389): #85     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3556)
I/flutter ( 5389): #86     Element.rebuild (package:flutter/src/widgets/framework.dart:3445)
I/flutter ( 5389): #87     ProxyElement.update (package:flutter/src/widgets/framework.dart:3791)
I/flutter ( 5389): #88     Element.updateChild (package:flutter/src/widgets/framework.dart:2649)
I/flutter ( 5389): #89     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4539)
I/flutter ( 5389): #90     Element.updateChild (package:flutter/src/widgets/framework.dart:2649)
I/flutter ( 5389): #91     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3556)
I/flutter ( 5389): #92     Element.rebuild (package:flutter/src/widgets/framework.dart:3445)
I/flutter ( 5389): #93     StatefulElement.update (package:flutter/src/widgets/framework.dart:3681)
I/flutter ( 5389): #94     Element.updateChild (package:flutter/src/widgets/framework.dart:2649)
I/flutter ( 5389): #95     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4539)
I/flutter ( 5389): #96     Element.updateChild (package:flutter/src/widgets/framework.dart:2649)
I/flutter ( 5389): #97     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4539)
I/flutter ( 5389): #98     Element.updateChild (package:flutter/src/widgets/framework.dart:2649)
I/flutter ( 5389): #99     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3556)
I/flutter ( 5389): #100    Element.rebuild (package:flutter/src/widgets/framework.dart:3445)
I/flutter ( 5389): #101    BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2193)
I/flutter ( 5389): #102    BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&RendererBinding&WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:611)
I/flutter ( 5389): #103    BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:203)
I/flutter ( 5389): #104    BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:916)
I/flutter ( 5389): #105    BindingBase&GestureBinding&ServicesBinding&SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:856)
I/flutter ( 5389): #106    BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:768)
I/flutter ( 5389): #107    _invoke (file:///b/build/slave/Linux_Engine/build/src/flutter/lib/ui/hooks.dart:113)
I/flutter ( 5389): #108    _drawFrame (file:///b/build/slave/Linux_Engine/build/src/flutter/lib/ui/hooks.dart:102)
I/flutter ( 5389): ════════════════════════════════════════════════════════════════════════════════════════════════════
I/flutter ( 5389): Another exception was thrown: NoSuchMethodError: The getter 'deviceWidth' was called on null.

This is happening both on android emulators and iOS simulators.

Flutter Doctor

[√] Flutter (on Microsoft Windows [Version 10.0.16299.64], locale en-US, channel master)
    • Flutter at C:\flutter
    • Framework revision 0c09179b65 (2 days ago), 2017-12-09 22:04:06 -0800
    • Engine revision edb0201fa2
    • Tools Dart version 1.25.0-dev.11.0
    • Engine Dart version 2.0.0-edge.a38ac7cf127f4611c873c2f2d523c06ce06b1342

[√] Android toolchain - develop for Android devices (Android SDK 27.0.0)
    • Android SDK at C:\android-sdk
    • Android NDK location not configured (optional; useful for native profiling support)
    • Platform android-27, build-tools 27.0.0
    • ANDROID_HOME = C:\android-sdk
    • Java binary at: C:\android-studio\jre\bin\java
    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-915-b01)
[√] Android Studio (version 3.0)
    • Android Studio at C:\android-studio
    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-915-b01)
[√] Connected devices
    • Android SDK built for x86 • emulator-5554 • android-x86 • Android 8.0.0 (API 26) (emulator)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions