Let RenderObjectWidgets use inherited properties
This prepares us for depending on the LTR/RTL inherited property in
RenderObjectWidgets.
diff --git a/packages/flutter/lib/src/widgets/framework.dart b/packages/flutter/lib/src/widgets/framework.dart
index 4e61e86..990499c 100644
--- a/packages/flutter/lib/src/widgets/framework.dart
+++ b/packages/flutter/lib/src/widgets/framework.dart
@@ -1165,6 +1165,13 @@
assert(_debugLifecycleState == _ElementLifecycle.active);
assert(() {
if (_debugBuilding) {
+ if (_debugCurrentBuildTarget == null) {
+ // If _debugCurrentBuildTarget is null, we're not actually building a
+ // widget but instead building the root of the tree via runApp.
+ // TODO(abarth): Remove these cases and ensure that we always have
+ // a current build target when we're building.
+ return true;
+ }
bool foundTarget = false;
visitAncestorElements((Element element) {
if (element == _debugCurrentBuildTarget) {
@@ -1214,17 +1221,12 @@
_debugCurrentBuildTarget = this;
return true;
});
- try {
- performRebuild();
- } catch (e, stack) {
- _debugReportException('rebuilding $this', e, stack);
- } finally {
- assert(() {
- assert(_debugCurrentBuildTarget == this);
- _debugCurrentBuildTarget = debugPreviousBuildTarget;
- return true;
- });
- }
+ performRebuild();
+ assert(() {
+ assert(_debugCurrentBuildTarget == this);
+ _debugCurrentBuildTarget = debugPreviousBuildTarget;
+ return true;
+ });
assert(!_dirty);
}
@@ -1618,6 +1620,7 @@
@override
void performRebuild() {
+ widget.updateRenderObject(this, renderObject);
_dirty = false;
}
diff --git a/packages/flutter/test/widget/render_object_widget_test.dart b/packages/flutter/test/widget/render_object_widget_test.dart
index f7301b6..e1e72c5 100644
--- a/packages/flutter/test/widget/render_object_widget_test.dart
+++ b/packages/flutter/test/widget/render_object_widget_test.dart
@@ -20,6 +20,27 @@
Widget build(BuildContext context) => child;
}
+class TestOrientedBox extends SingleChildRenderObjectWidget {
+ TestOrientedBox({ Key key, Widget child }) : super(key: key, child: child);
+
+ Decoration _getDecoration(BuildContext context) {
+ switch (MediaQuery.of(context).orientation) {
+ case Orientation.landscape:
+ return new BoxDecoration(backgroundColor: const Color(0xFF00FF00));
+ case Orientation.portrait:
+ return new BoxDecoration(backgroundColor: const Color(0xFF0000FF));
+ }
+ }
+
+ @override
+ RenderDecoratedBox createRenderObject(BuildContext context) => new RenderDecoratedBox(decoration: _getDecoration(context));
+
+ @override
+ void updateRenderObject(BuildContext context, RenderDecoratedBox renderObject) {
+ renderObject.decoration = _getDecoration(context);
+ }
+}
+
void main() {
test('RenderObjectWidget smoke test', () {
testWidgets((WidgetTester tester) {
@@ -171,4 +192,28 @@
expect(grandChild.child, isNull);
});
});
+
+ test('Can watch inherited widgets', () {
+ testWidgets((WidgetTester tester) {
+ Key boxKey = new UniqueKey();
+ TestOrientedBox box = new TestOrientedBox(key: boxKey);
+
+ tester.pumpWidget(new MediaQuery(
+ data: new MediaQueryData(size: const Size(400.0, 300.0)),
+ child: box
+ ));
+
+ RenderDecoratedBox renderBox = tester.findElementByKey(boxKey).renderObject;
+ BoxDecoration decoration = renderBox.decoration;
+ expect(decoration.backgroundColor, equals(new Color(0xFF00FF00)));
+
+ tester.pumpWidget(new MediaQuery(
+ data: new MediaQueryData(size: const Size(300.0, 400.0)),
+ child: box
+ ));
+
+ decoration = renderBox.decoration;
+ expect(decoration.backgroundColor, equals(new Color(0xFF0000FF)));
+ });
+ });
}