mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
Merge pull request #1302 from Hixie/coordinates
Expose _descendantRenderObject as 'renderer'
This commit is contained in:
commit
f6973af099
@ -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
|
||||
|
||||
46
sky/unit/test/fn3/coordinates_test.dart
Normal file
46
sky/unit/test/fn3/coordinates_test.dart
Normal file
@ -0,0 +1,46 @@
|
||||
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)
|
||||
return e;
|
||||
rethrow;
|
||||
} on Element catch (e) {
|
||||
return e;
|
||||
}
|
||||
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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user