// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import '../rendering/src/solid_color_box.dart'; // Solid colour, RenderObject version void addFlexChildSolidColor(RenderFlex parent, Color backgroundColor, { int flex: 0 }) { final RenderSolidColorBox child = new RenderSolidColorBox(backgroundColor); parent.add(child); final FlexParentData childParentData = child.parentData; childParentData.flex = flex; } // Solid colour, Widget version class Rectangle extends StatelessWidget { const Rectangle(this.color, { Key key }) : super(key: key); final Color color; @override Widget build(BuildContext context) { return new Expanded( child: new Container( color: color, ) ); } } double value; RenderObjectToWidgetElement<RenderBox> element; BuildOwner owner = new BuildOwner(); void attachWidgetTreeToRenderTree(RenderProxyBox container) { element = new RenderObjectToWidgetAdapter<RenderBox>( container: container, child: new Container( height: 300.0, child: new Column( children: <Widget>[ const Rectangle(const Color(0xFF00FFFF)), new Material( child: new Container( padding: const EdgeInsets.all(10.0), margin: const EdgeInsets.all(10.0), child: new Row( children: <Widget>[ new RaisedButton( child: new Row( children: <Widget>[ new Image.network('https://flutter.io/images/favicon.png'), const Text('PRESS ME'), ] ), onPressed: () { value = value == null ? 0.1 : (value + 0.1) % 1.0; attachWidgetTreeToRenderTree(container); } ), new CircularProgressIndicator(value: value), ], mainAxisAlignment: MainAxisAlignment.spaceAround ) ) ), const Rectangle(const Color(0xFFFFFF00)), ], mainAxisAlignment: MainAxisAlignment.spaceBetween ) ) ).attachToRenderTree(owner, element); } Duration timeBase; RenderTransform transformBox; void rotate(Duration timeStamp) { timeBase ??= timeStamp; final double delta = (timeStamp - timeBase).inMicroseconds.toDouble() / Duration.MICROSECONDS_PER_SECOND; // radians transformBox.setIdentity(); transformBox.rotateZ(delta); owner.buildScope(element); } void main() { final WidgetsBinding binding = WidgetsFlutterBinding.ensureInitialized(); final RenderProxyBox proxy = new RenderProxyBox(); attachWidgetTreeToRenderTree(proxy); final RenderFlex flexRoot = new RenderFlex(direction: Axis.vertical); addFlexChildSolidColor(flexRoot, const Color(0xFFFF00FF), flex: 1); flexRoot.add(proxy); addFlexChildSolidColor(flexRoot, const Color(0xFF0000FF), flex: 1); transformBox = new RenderTransform(child: flexRoot, transform: new Matrix4.identity(), alignment: FractionalOffset.center); final RenderPadding root = new RenderPadding(padding: const EdgeInsets.all(80.0), child: transformBox); binding.renderView.child = root; binding.addPersistentFrameCallback(rotate); }