Fix custom Elements that wants to decorate State.build (#49925)

diff --git a/packages/flutter/lib/src/widgets/framework.dart b/packages/flutter/lib/src/widgets/framework.dart
index 2b697db..b59e1c5 100644
--- a/packages/flutter/lib/src/widgets/framework.dart
+++ b/packages/flutter/lib/src/widgets/framework.dart
@@ -4586,13 +4586,7 @@
   }
 
   @override
-  Widget build() {
-    if (_didChangeDependencies) {
-      _state.didChangeDependencies();
-      _didChangeDependencies = false;
-    }
-    return state.build(this);
-  }
+  Widget build() => _state.build(this);
 
   /// The [State] instance associated with this location in the tree.
   ///
@@ -4643,6 +4637,15 @@
   }
 
   @override
+  void performRebuild() {
+    if (_didChangeDependencies) {
+      _state.didChangeDependencies();
+      _didChangeDependencies = false;
+    }
+    super.performRebuild();
+  }
+
+  @override
   void update(StatefulWidget newWidget) {
     super.update(newWidget);
     assert(widget == newWidget);
diff --git a/packages/flutter/test/widgets/framework_test.dart b/packages/flutter/test/widgets/framework_test.dart
index 1a5fba1..b2f3bb2 100644
--- a/packages/flutter/test/widgets/framework_test.dart
+++ b/packages/flutter/test/widgets/framework_test.dart
@@ -1259,6 +1259,80 @@
     expect(state.didChangeDependenciesCount, 3);
     expect(state.deactivatedCount, 2);
   });
+
+  testWidgets('StatefulElement subclass can decorate State.build', (WidgetTester tester) async {
+    bool isDidChangeDependenciesDecorated;
+    bool isBuildDecorated;
+
+    final Widget child = Decorate(
+      didChangeDependencies: (bool value) {
+        isDidChangeDependenciesDecorated = value;
+      },
+      build: (bool value) {
+        isBuildDecorated = value;
+      }
+    );
+
+    await tester.pumpWidget(Inherited(0, child: child));
+
+    expect(isBuildDecorated, isTrue);
+    expect(isDidChangeDependenciesDecorated, isFalse);
+
+    await tester.pumpWidget(Inherited(1, child: child));
+
+    expect(isBuildDecorated, isTrue);
+    expect(isDidChangeDependenciesDecorated, isFalse);
+  });
+}
+
+class Decorate extends StatefulWidget {
+  const Decorate({
+    Key key,
+    @required this.didChangeDependencies,
+    @required this.build
+  }) :
+    assert(didChangeDependencies != null),
+    assert(build != null),
+    super(key: key);
+
+  final void Function(bool isInBuild) didChangeDependencies;
+  final void Function(bool isInBuild) build;
+
+  @override
+  _DecorateState createState() => _DecorateState();
+
+  @override
+  DecorateElement createElement() => DecorateElement(this);
+}
+
+class DecorateElement extends StatefulElement {
+  DecorateElement(Decorate widget): super(widget);
+
+  bool isDecorated = false;
+
+  @override
+  Widget build() {
+    try {
+      isDecorated = true;
+      return super.build();
+    } finally {
+      isDecorated = false;
+    }
+  }
+}
+
+class _DecorateState extends State<Decorate> {
+  @override
+  void didChangeDependencies() {
+    super.didChangeDependencies();
+    widget.didChangeDependencies.call((context as DecorateElement).isDecorated);
+  }
+  @override
+  Widget build(covariant DecorateElement context) {
+    context.dependOnInheritedWidgetOfExactType<Inherited>();
+    widget.build.call(context.isDecorated);
+    return Container();
+  }
 }
 
 class NullChildTest extends Widget {