Commit b3ebd440 authored by Hixie's avatar Hixie

Expose _descendantRenderObject as 'renderer'

This allows people to use localToGlobal and company.
parent 4bc4c978
...@@ -425,10 +425,10 @@ abstract class Element<T extends Widget> implements BuildContext { ...@@ -425,10 +425,10 @@ abstract class Element<T extends Widget> implements BuildContext {
T get widget => _widget; T get widget => _widget;
T _widget; T _widget;
RenderObject get _descendantRenderObject { RenderObject get renderObject {
RenderObject result; RenderObject result;
void visit(Element element) { void visit(Element element) {
assert(result == null); assert(result == null); // this verifies that there's only one child
if (element is RenderObjectElement) if (element is RenderObjectElement)
result = element.renderObject; result = element.renderObject;
else else
...@@ -800,10 +800,11 @@ class InheritedElement extends StatelessComponentElement<InheritedWidget> { ...@@ -800,10 +800,11 @@ class InheritedElement extends StatelessComponentElement<InheritedWidget> {
/// Base class for instantiations of RenderObjectWidget subclasses /// Base class for instantiations of RenderObjectWidget subclasses
abstract class RenderObjectElement<T extends RenderObjectWidget> extends Element<T> { abstract class RenderObjectElement<T extends RenderObjectWidget> extends Element<T> {
RenderObjectElement(T widget) RenderObjectElement(T widget)
: renderObject = widget.createRenderObject(), super(widget); : _renderObject = widget.createRenderObject(), super(widget);
/// The underlying [RenderObject] for this element /// The underlying [RenderObject] for this element
final RenderObject renderObject; RenderObject get renderObject => _renderObject;
final RenderObject _renderObject;
RenderObjectElement _ancestorRenderObjectElement; RenderObjectElement _ancestorRenderObjectElement;
RenderObjectElement _findAncestorRenderObjectElement() { RenderObjectElement _findAncestorRenderObjectElement() {
...@@ -938,7 +939,7 @@ class MultiChildRenderObjectElement<T extends MultiChildRenderObjectWidget> exte ...@@ -938,7 +939,7 @@ class MultiChildRenderObjectElement<T extends MultiChildRenderObjectWidget> exte
void insertChildRenderObject(RenderObject child, Element slot) { void insertChildRenderObject(RenderObject child, Element slot) {
final renderObject = this.renderObject; // TODO(ianh): Remove this once the analyzer is cleverer final renderObject = this.renderObject; // TODO(ianh): Remove this once the analyzer is cleverer
RenderObject nextSibling = slot?._descendantRenderObject; RenderObject nextSibling = slot?.renderObject;
assert(renderObject is ContainerRenderObjectMixin); assert(renderObject is ContainerRenderObjectMixin);
renderObject.add(child, before: nextSibling); renderObject.add(child, before: nextSibling);
assert(renderObject == this.renderObject); // TODO(ianh): Remove this once the analyzer is cleverer assert(renderObject == this.renderObject); // TODO(ianh): Remove this once the analyzer is cleverer
...@@ -946,7 +947,7 @@ class MultiChildRenderObjectElement<T extends MultiChildRenderObjectWidget> exte ...@@ -946,7 +947,7 @@ class MultiChildRenderObjectElement<T extends MultiChildRenderObjectWidget> exte
void moveChildRenderObject(RenderObject child, dynamic slot) { void moveChildRenderObject(RenderObject child, dynamic slot) {
final renderObject = this.renderObject; // TODO(ianh): Remove this once the analyzer is cleverer final renderObject = this.renderObject; // TODO(ianh): Remove this once the analyzer is cleverer
RenderObject nextSibling = slot?._descendantRenderObject; RenderObject nextSibling = slot?.renderObject;
assert(renderObject is ContainerRenderObjectMixin); assert(renderObject is ContainerRenderObjectMixin);
renderObject.move(child, before: nextSibling); renderObject.move(child, before: nextSibling);
assert(renderObject == this.renderObject); // TODO(ianh): Remove this once the analyzer is cleverer assert(renderObject == this.renderObject); // TODO(ianh): Remove this once the analyzer is cleverer
......
import 'package:sky/src/fn3.dart';
import 'package:test/test.dart';
import 'widget_tester.dart';
void main() {
test('Comparing coordinates', () {
WidgetTester tester = new WidgetTester();
Key keyA = new GlobalKey();
Key keyB = new GlobalKey();
Key keyC = new GlobalKey();
tester.pumpFrame(
new Stack([
new Positioned(
top: 100.0,
left: 100.0,
child: new SizedBox(
key: keyA,
width: 10.0,
height: 10.0
)
),
new Positioned(
left: 100.0,
top: 200.0,
child: new SizedBox(
key: keyB,
width: 20.0,
height: 10.0
)
),
])
);
expect(tester.findElementByKey(keyA).renderObject.localToGlobal(const Point(0.0, 0.0)),
equals(const Point(100.0, 100.0)));
expect(tester.findElementByKey(keyB).renderObject.localToGlobal(const Point(0.0, 0.0)),
equals(const Point(100.0, 200.0)));
expect(tester.findElementByKey(keyB).renderObject.globalToLocal(const Point(110.0, 205.0)),
equals(const Point(10.0, 5.0)));
});
}
...@@ -28,20 +28,22 @@ class WidgetTester { ...@@ -28,20 +28,22 @@ class WidgetTester {
WidgetFlutterBinding.instance.renderViewElement.visitChildren(walk); WidgetFlutterBinding.instance.renderViewElement.visitChildren(walk);
} }
Element findElement(bool predicate(Element widget)) { Element findElement(bool predicate(Element element)) {
try { try {
walkElements((Element widget) { walkElements((Element element) {
if (predicate(widget)) if (predicate(element))
throw widget; throw element;
}); });
} catch (e) { } on Element catch (e) {
if (e is Element)
return e; return e;
rethrow;
} }
return null; return null;
} }
Element findElementByKey(Key key) {
return findElement((Element element) => element.widget.key == key);
}
void pumpFrame(Widget widget) { void pumpFrame(Widget widget) {
runApp(widget); runApp(widget);
WidgetFlutterBinding.instance.beginFrame(0.0); // TODO(ianh): https://github.com/flutter/engine/issues/1084 WidgetFlutterBinding.instance.beginFrame(0.0); // TODO(ianh): https://github.com/flutter/engine/issues/1084
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment