diff --git a/examples/game/main.dart b/examples/game/main.dart index 4b5dc61d54b..6282cce5a31 100644 --- a/examples/game/main.dart +++ b/examples/game/main.dart @@ -23,7 +23,7 @@ void main() { void allLoaded(ImageMap loader) { _loader = loader; - new GameDemoApp(); + runApp(new GameDemoApp()); } class GameDemoApp extends App { diff --git a/examples/stocks2/lib/stock_app.dart b/examples/stocks2/lib/stock_app.dart index 1586b173553..c5485b14abb 100644 --- a/examples/stocks2/lib/stock_app.dart +++ b/examples/stocks2/lib/stock_app.dart @@ -12,8 +12,6 @@ import 'stock_settings.dart'; class StocksApp extends App { - StocksApp({ RenderView renderViewOverride }) : super(renderViewOverride: renderViewOverride); - NavigationState _navState = new NavigationState([ new Route(name: '/', builder: (navigator) => new StockHome(navigator)), new Route(name: '/settings', builder: (navigator) => new StockSettings(navigator)), @@ -37,7 +35,7 @@ class StocksApp extends App { void main() { print("starting stocks app!"); - App app = new StocksApp(); + runApp(new StocksApp()); WidgetAppView.appView.onFrame = () { // uncomment this for debugging: // WidgetAppView.appView.debugDumpRenderTree(); diff --git a/examples/widgets/container.dart b/examples/widgets/container.dart index 68e734864d3..2c61f698ce7 100644 --- a/examples/widgets/container.dart +++ b/examples/widgets/container.dart @@ -51,5 +51,5 @@ class ContainerApp extends App { } void main() { - new ContainerApp(); + runApp(new ContainerApp()); } diff --git a/examples/widgets/hello_widgets.dart b/examples/widgets/hello_widgets.dart index bc914c8d247..c774ef80a8d 100644 --- a/examples/widgets/hello_widgets.dart +++ b/examples/widgets/hello_widgets.dart @@ -11,5 +11,5 @@ class HelloWorldApp extends App { } void main() { - new HelloWorldApp(); + runApp(new HelloWorldApp()); } diff --git a/examples/widgets/navigation.dart b/examples/widgets/navigation.dart index 82e81f85020..a5e32000278 100644 --- a/examples/widgets/navigation.dart +++ b/examples/widgets/navigation.dart @@ -73,5 +73,5 @@ class NavigationExampleApp extends App { } void main() { - App app = new NavigationExampleApp(); + runApp(new NavigationExampleApp()); } diff --git a/examples/widgets/sector.dart b/examples/widgets/sector.dart index e8beeaf8b15..bea64af8d3f 100644 --- a/examples/widgets/sector.dart +++ b/examples/widgets/sector.dart @@ -137,7 +137,7 @@ class SectorApp extends App { } void main() { - App app = new SectorApp(); + runApp(new SectorApp()); WidgetAppView.appView.onFrame = () { // uncomment this for debugging: // WidgetAppView.appView.debugDumpRenderTree(); diff --git a/home.dart b/home.dart index a4ce45b172f..bf6a4ac066b 100644 --- a/home.dart +++ b/home.dart @@ -79,5 +79,5 @@ class SkyHome extends App { } void main() { - new SkyHome(); + runApp(new SkyHome()); } diff --git a/sdk/lib/app/view.dart b/sdk/lib/app/view.dart index b6022d15661..d476d5bce36 100644 --- a/sdk/lib/app/view.dart +++ b/sdk/lib/app/view.dart @@ -42,6 +42,7 @@ class AppView { static AppView _app; // used to enforce that we're a singleton RenderView _renderView; + RenderView get renderView => _renderView; ViewConstraints get _viewConstraints => new ViewConstraints(width: sky.view.width, height: sky.view.height); diff --git a/sdk/lib/widgets/basic.dart b/sdk/lib/widgets/basic.dart index 89d2d57c2be..453098b46eb 100644 --- a/sdk/lib/widgets/basic.dart +++ b/sdk/lib/widgets/basic.dart @@ -15,7 +15,7 @@ import 'widget.dart'; export '../rendering/box.dart' show BoxConstraints, BoxDecoration, Border, BorderSide, EdgeDims; export '../rendering/flex.dart' show FlexDirection, FlexJustifyContent, FlexAlignItems; export '../rendering/object.dart' show Point, Size, Rect, Color, Paint, Path; -export 'widget.dart' show Widget, Component, App, Listener, ParentDataNode; +export 'widget.dart' show Widget, Component, App, runApp, Listener, ParentDataNode; // PAINTING NODES diff --git a/sdk/lib/widgets/widget.dart b/sdk/lib/widgets/widget.dart index fcf6ebbceec..e96f3d22db5 100644 --- a/sdk/lib/widgets/widget.dart +++ b/sdk/lib/widgets/widget.dart @@ -23,7 +23,7 @@ abstract class Widget { Widget({ String key }) { _key = key != null ? key : runtimeType.toString(); - assert(this is AbstractWidgetRoot || _inRenderDirtyComponents); // you should not build the UI tree ahead of time, build it only during build() + assert(this is AbstractWidgetRoot || this is App || _inRenderDirtyComponents); // you should not build the UI tree ahead of time, build it only during build() } String _key; @@ -474,7 +474,10 @@ abstract class RenderObjectWrapper extends Widget { static RenderObjectWrapper _getMounted(RenderObject node) => _nodeMap[node]; void _sync(Widget old, dynamic slot) { - assert(parent != null); + // TODO(abarth): We should split RenderObjectWrapper into two pieces so that + // RenderViewObject doesn't need to inherit all this code it + // doesn't need. + assert(parent != null || this is RenderViewWrapper); if (old == null) { _root = createNode(); var ancestor = findAncestor(RenderObjectWrapper); @@ -767,10 +770,14 @@ class WidgetAppView extends AppView { } +abstract class App extends Component { + // Override this to handle back button behavior in your app + void onBack() { } +} + abstract class AbstractWidgetRoot extends Component { - AbstractWidgetRoot({ RenderView renderViewOverride }) : super(stateful: true) { - WidgetAppView.initWidgetAppView(renderViewOverride: renderViewOverride); + AbstractWidgetRoot() : super(stateful: true) { _mounted = true; _scheduleComponentForRender(this); } @@ -789,27 +796,24 @@ abstract class AbstractWidgetRoot extends Component { } -abstract class App extends AbstractWidgetRoot { +class RenderViewWrapper extends OneChildRenderObjectWrapper { + RenderViewWrapper({ String key, Widget child }) : super(key: key, child: child); - App({ RenderView renderViewOverride }) : super(renderViewOverride: renderViewOverride); + RenderView get root => super.root; + RenderView createNode() => WidgetAppView._appView.renderView; +} - void _buildIfDirty() { - super._buildIfDirty(); +class AppContainer extends AbstractWidgetRoot { + AppContainer(this.app); - if (root.parent == null) { - // we haven't attached it yet - WidgetAppView._appView.root = root; - WidgetAppView._appView.eventListeners.add((event) { - if (event.type == "back") - onBack(); - }); - } - assert(root.parent is RenderView); - } + final App app; - // Override this to handle back button behavior in your app - void onBack() { } + Widget build() => new RenderViewWrapper(child: app); +} +void runApp(App app, { RenderView renderViewOverride }) { + WidgetAppView.initWidgetAppView(renderViewOverride: renderViewOverride); + new AppContainer(app); } typedef Widget Builder(); diff --git a/tests/framework/stocks.dart b/tests/framework/stocks.dart index c1b379f4f5a..69922b7fca6 100644 --- a/tests/framework/stocks.dart +++ b/tests/framework/stocks.dart @@ -18,7 +18,7 @@ void main() { TestRenderView testRenderView = new TestRenderView(); test("launching stock app", () { - new StocksApp(renderViewOverride: testRenderView); + runApp(new StocksApp(), renderViewOverride: testRenderView); new Future.microtask(testRenderView.checkFrame); }); } diff --git a/tests/resources/display_list.dart b/tests/resources/display_list.dart index 8879818290c..7de956b696d 100644 --- a/tests/resources/display_list.dart +++ b/tests/resources/display_list.dart @@ -160,10 +160,7 @@ class TestRenderView extends RenderView { } class TestApp extends App { - TestApp({ - this.builder, - RenderView renderViewOverride - }) : super(renderViewOverride: renderViewOverride); + TestApp({ this.builder }); Function builder; @@ -176,7 +173,7 @@ class WidgetTester { TestRenderView renderView = new TestRenderView(); Future test(Function builder) { - new TestApp(renderViewOverride: renderView, builder: builder); + runApp(new TestApp(builder: builder), renderViewOverride: renderView); return new Future.microtask(renderView.checkFrame); }