Merge pull request #2674 from abarth/child_view_error
Improve error handling for ChildView outside MojoShell
diff --git a/packages/flutter/lib/src/rendering/child_view.dart b/packages/flutter/lib/src/rendering/child_view.dart
index 33e5267..ca61732 100644
--- a/packages/flutter/lib/src/rendering/child_view.dart
+++ b/packages/flutter/lib/src/rendering/child_view.dart
@@ -19,11 +19,8 @@
mojom.ViewProxy _initViewProxy() {
int viewHandle = ui.takeViewHandle();
- assert(() {
- if (viewHandle == core.MojoHandle.INVALID)
- debugPrint('Child view are supported only when running in Mojo shell.');
- return true;
- });
+ if (viewHandle == core.MojoHandle.INVALID)
+ return null;
return new mojom.ViewProxy.fromHandle(new core.MojoHandle(viewHandle));
}
@@ -74,7 +71,7 @@
assert(_viewOwner != null);
assert(_viewKey == null);
_viewKey = _nextViewKey++;
- _view.addChild(_viewKey, _viewOwner.impl);
+ _view?.addChild(_viewKey, _viewOwner.impl);
_viewOwner = null;
}
@@ -83,7 +80,7 @@
assert(_viewOwner == null);
assert(_viewKey != null);
_viewOwner = new mojom.ViewOwnerProxy.unbound();
- _view.removeChild(_viewKey, _viewOwner);
+ _view?.removeChild(_viewKey, _viewOwner);
_viewKey = null;
}
@@ -117,6 +114,8 @@
assert(_attached);
assert(_attachments == 1);
assert(_viewKey != null);
+ if (_view == null)
+ return new Future<mojom.ViewLayoutInfo>.value(null);
int width = (size.width * scale).round();
int height = (size.height * scale).round();
// TODO(abarth): Ideally we would propagate our actually constraints to be
@@ -188,9 +187,25 @@
size = constraints.biggest;
}
+ TextPainter _debugErrorMessage;
+
void performLayout() {
- if (_child != null)
+ if (_child != null) {
_child._layout(size: size, scale: scale).then(_handleLayoutInfoChanged);
+ assert(() {
+ if (_view == null) {
+ _debugErrorMessage ??= new TextPainter()
+ ..text = new TextSpan(text: 'Child view are supported only when running in Mojo shell.');
+ _debugErrorMessage
+ ..minWidth = size.width
+ ..maxWidth = size.width
+ ..minHeight = size.height
+ ..maxHeight = size.height
+ ..layout();
+ }
+ return true;
+ });
+ }
}
mojom.ViewLayoutInfo _layoutInfo;
@@ -206,6 +221,13 @@
assert(needsCompositing);
if (_layoutInfo != null)
context.pushChildScene(offset, scale, _layoutInfo);
+ assert(() {
+ if (_view == null) {
+ context.canvas.drawRect(offset & size, new Paint()..color = const Color(0xFF0000FF));
+ _debugErrorMessage.paint(context.canvas, offset);
+ }
+ return true;
+ });
}
void debugFillDescription(List<String> description) {