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 {
T get widget => _widget;
T _widget;
RenderObject get _descendantRenderObject {
RenderObject get renderObject {
RenderObject result;
void visit(Element element) {
assert(result == null);
assert(result == null); // this verifies that there's only one child
if (element is RenderObjectElement)
result = element.renderObject;
else
......@@ -800,10 +800,11 @@ class InheritedElement extends StatelessComponentElement<InheritedWidget> {
/// Base class for instantiations of RenderObjectWidget subclasses
abstract class RenderObjectElement<T extends RenderObjectWidget> extends Element<T> {
RenderObjectElement(T widget)
: renderObject = widget.createRenderObject(), super(widget);
: _renderObject = widget.createRenderObject(), super(widget);
/// The underlying [RenderObject] for this element
final RenderObject renderObject;
RenderObject get renderObject => _renderObject;
final RenderObject _renderObject;
RenderObjectElement _ancestorRenderObjectElement;
RenderObjectElement _findAncestorRenderObjectElement() {
......@@ -938,7 +939,7 @@ class MultiChildRenderObjectElement<T extends MultiChildRenderObjectWidget> exte
void insertChildRenderObject(RenderObject child, Element slot) {
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);
renderObject.add(child, before: nextSibling);
assert(renderObject == this.renderObject); // TODO(ianh): Remove this once the analyzer is cleverer
......@@ -946,7 +947,7 @@ class MultiChildRenderObjectElement<T extends MultiChildRenderObjectWidget> exte
void moveChildRenderObject(RenderObject child, dynamic slot) {
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);
renderObject.move(child, before: nextSibling);
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 {
WidgetFlutterBinding.instance.renderViewElement.visitChildren(walk);
}
Element findElement(bool predicate(Element widget)) {
Element findElement(bool predicate(Element element)) {
try {
walkElements((Element widget) {
if (predicate(widget))
throw widget;
walkElements((Element element) {
if (predicate(element))
throw element;
});
} catch (e) {
if (e is Element)
} on Element catch (e) {
return e;
rethrow;
}
return null;
}
Element findElementByKey(Key key) {
return findElement((Element element) => element.widget.key == key);
}
void pumpFrame(Widget widget) {
runApp(widget);
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